0

我最近需要在我的 android 应用程序的活动中使用 AsyncTask。所以我在活动中创建了一个类,并在该类中扩展了 AsyncTask。

但是现在,每当我启动该特定活动时,我的应用程序都会立即崩溃。我尝试将整个onCreate()活动放在一个 try、catch 块中,但没有引发异常。当我启动该活动时,该应用程序立即崩溃,LogCat 中没有任何解释。

这在我添加了上面提到的 AsyncTask 类之后开始发生。此外,启动活动时不会执行 AsyncTask 部分,它会在按下按钮时执行。可能出了什么问题?我在下面添加了相关代码:

public class ListViewA extends Activity{

    public void onCreate(Bundle savedInstanceState) {try{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ListView lv= (ListView)findViewById(R.id.listview);
        //computation
    }

    private String[] top() {
        new RetreiveFeedTask().execute(ctr,ctz);
        return er;
    }

    public class RetreiveFeedTask extends AsyncTask<Context, Void, String[]> {
        String[] q;

        protected String[] doInBackground(Context... params) {
            //computation
        }

        protected void onPostExecute() {
            er=q;
            gff=true;
        }
    }

编辑: 我在 LogCat 中发现了一个看起来很重要的错误:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.exampleapp/com.example.exampleapp.ListViewA}: java.lang.NullPointerException
4

3 回答 3

0

我的程序中有一个private class ReadFilesTask extends AsyncTask<String, Void, String>
在此之下,我有:
protected void onPreExecute()
protected String doInBackground(String... params)
protected Void onPostExecute(String result)
前两个@Override在他们之上。不过,我实际使用的唯一一个是doInBackground. 我首先真的只是尝试添加@OverridedoInBackground(). 接下来,尝试更改ContextString.

编辑:
您还缺少获取活动的功能。同样,这只是我在代码中所做的以及我在网上看到的一些示例:

 
公共RetreiveFeedTask(活动活动){

this.activity = activity;

}

类似的东西。

于 2013-05-24T20:11:21.533 回答
0

您的编辑很有趣,表明 Activity 的实例化存在问题,在这种情况下,我会非常仔细地查看变量声明。但是,在没有任何代码(或更多onCreate代码)或 logcat 中的周围行的情况下,很难更具体。

正如@Raghunandan 所说,您的 AsynTask 构造方式不正确,应该类似于:

public class RetreiveFeedTask extends AsyncTask<Context, Void, String[]> {
    String[] q;

    @Override
    protected String[] doInBackground(Context... params) {
        //computation
        return result; // result is of type String[]
    }

    protected void onPostExecute(String[] result) {
        // do something with result ...
        er=q;
        gff=true;
    }
}

第二点是你的top()函数,它返回er. 我猜你希望它等到 AsyncTask 完成然后返回er,这是由 AsyncTask 计算出来的。但是,它目前要做的是设置 AsyncTask 然后立即返回er:它不会等待 AsyncTask 完成。

为此,您可能需要将按钮按下操作分为两个阶段:

  1. 创建并运行 AsyncTask
  2. AsyncTask 中的 OnPostExecute 调用当前使用ertop 返回的代码。
于 2013-05-24T20:11:30.637 回答
0
public class ListViewA extends Activity{
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ListView lv= (ListView)findViewById(R.id.listview);
        //computation

        new RetreiveFeedTask().execute(ctr,ctz);
    }
    ...

    public class RetreiveFeedTask extends AsyncTask<Context, Void, String[]>{

         @Override
         protected String[] doInBackground(Context... fileName) {
             //computation
             String[] q;
             //Know that fileName is an Array
             return q
         }

         protected void onPostExecute(String[] result) {
             //do something with the result
         }
    }
...
}
于 2013-05-24T20:13:46.880 回答