0

我有以下代码:

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 似乎没有被调用,并且 Activity 在从 doInBackground 返回时崩溃,LogCat 建议 nullPointerException 试图触发 Intent(在我开始弄乱 AsynchTask 之前我已经测试过并且工作正常)

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

谢谢

4

3 回答 3

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);
    }
}
于 2012-05-15T21:57:43.763 回答
1

我认为瓦卡斯是正确的。您正在执行一个AsyncTask执行后设置 public static变量的操作list。此列表用于传递到Intent您在 中创建的onCreate。但是,不能保证AsyncTask在您创建Intent. 因此,list此时的值为null

因此,正如 Waqas 建议的那样,您需要在为设置值Intent 之后list创建,即在 内onPostExecute

于 2012-05-15T22:05:50.063 回答
1

澄清一下,AsyncTask 是异步执行的,正如它的名字所暗示的那样。当您调用
new ProcessFileTask().execute(ctx)
时,那段代码会关闭并执行它的工作,但随后您的代码的其余部分会继续执行,这意味着在您尝试开始时可能不会填充列表新的 Intent,因为在您尝试启动新 Activity 并将 List 对象传递给它时,AsyncTask 可能尚未完成执行。

于 2012-05-15T22:11:20.570 回答