我有以下代码:
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之前工作正常)
知道为什么会这样吗?代码看起来很简单......
由于
答案 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对象传递给它时已完成执行。