从doInBackground返回时AsyncTask崩溃

时间:2012-05-15 21:52:41

标签: android

我有以下代码:

public class TestSynch extends Activity {

public static ArrayList<HashMap<String,String>> list;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.splash);
    Context ctx = this.getApplicationContext();


    new ProcessFileTask().execute(ctx);

    Intent i = new Intent(TestSynch.this, ListSchools.class);
    i.setAction(Intent.ACTION_VIEW);
    i.putExtra("arraylist", list);
    startActivity(i);

}

private class ProcessFileTask extends AsyncTask<Context, Void, ArrayList<HashMap<String,String>>> {
    @Override
    protected ArrayList<HashMap<String,String>> doInBackground(Context... ctx) {

        ArrayList<HashMap<String,String>> threadList = FileOperations.getListAsMaps(ctx[0]);
        return threadList;
    }
    @Override
    protected void onPostExecute(ArrayList<HashMap<String,String>> result) {
         list = result;
        return;
    }
}

我可以调试返回threadList; doInBackground中的行,并且ArrayList变量threadList完全正确。

然而,onPostExecute似乎没有被调用,并且在从doInBackground返回时Activity崩溃,LogCat建议尝试触发Intent的nullPointerException(我之前已经测试并且在我开始搞乱AsynchTask之前工作正常)

知道为什么会这样吗?代码看起来很简单......

由于

3 个答案:

答案 0 :(得分:5)

您需要在Async的 onPostExecute 方法中移动 startActivity 部分。

例如:

public class TestSynch extends Activity {

//public static ArrayList<HashMap<String,String>> list;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.splash);
    Context ctx = this.getApplicationContext();


    new ProcessFileTask().execute(ctx);
}

private class ProcessFileTask extends AsyncTask<Context, Void, 
        ArrayList<HashMap<String,String>>> {
    @Override
    protected ArrayList<HashMap<String,String>> doInBackground(Context... ctx) {

        ArrayList<HashMap<String,String>> threadList = 
             FileOperations.getListAsMaps(ctx[0]);

        return threadList;
    }
    @Override
    protected void onPostExecute(ArrayList<HashMap<String,String>> result) {
         Intent i = new Intent(TestSynch.this, ListSchools.class);
         i.setAction(Intent.ACTION_VIEW);
         i.putExtra("arraylist", result);
         startActivity(i);
    }
}

答案 1 :(得分:1)

我认为Waqas是对的。您执行的AsyncTask执行后会设置public static变量list。此列表用于传递您在Intent中创建的onCreate。但是,无法保证AsyncTask在您创建Intent时已实际完成。因此,此时list的值为null

所以,正如Waqas建议的那样,你需要在之后创建Intent ,为list设置一个值,即在onPostExecute内。

答案 2 :(得分:1)

只是为了澄清,AsyncTask以其名称暗示的方式异步执行。当你打电话给      new ProcessFileTask()。execute(ctx)
那段代码关闭并完成它的工作但是其余的代码继续执行,这意味着当你尝试启动新的Intent时,列表可能不会填充,因为AsyncTask可能不会在您尝试启动新活动并将List对象传递给它时已完成执行。