将AsyncTask类添加到活动会导致应用崩溃

时间:2013-05-24 19:59:49

标签: java android android-asynctask

我最近需要在我的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

3 个答案:

答案 0 :(得分:0)

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

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

 
public RetreiveFeedTask(Activity activity) {

this.activity = activity;

}

类似的东西。

答案 1 :(得分: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调用当前使用top返回的er的代码。

答案 2 :(得分: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
         }
    }
...
}