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が呼び出されていないようで、doInBackgroundから戻るとActivityがクラッシュし、LogCatがインテントを起動しようとしているnullPointerExceptionを示唆しています(AsynchTaskをいじり始める前にテストして正常に動作しました)

なぜこれが起こっているのか考えていますか?コードは十分に単純なようです...

ありがとう

4

3 に答える 3

5

startActivity部分をAsyncのonPostExecuteメソッド内に移動する必要があります。

例えば:

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は、その名前が示すように、非同期で実行されます。
new ProcessFileTask()。execute(ctx) を呼び出すと
、そのコードはオフになり、実行を実行しますが、残りのコードは実行を継続します。つまり、開始しようとするまでにリストにデータが入力されない場合があります。新しいアクティビティを開始してListオブジェクトを渡そうとするまでに、AsyncTaskの実行が完了していない可能性があるため、新しいインテント。

于 2012-05-15T22:11:20.570 に答える
1

ワカスは正しいと思います。あなたはそれが実行された後に変数AsyncTaskを設定することを実行してい ます。このリストは、で作成したに渡すために使用されます。ただし、を作成した時点でが実際に完了したという保証はありません。そのため、この時点でのの値はです。public staticlistIntentonCreateAsyncTaskIntentlistnull

したがって、Waqasが示唆しているように、の値を設定したIntent list、つまり。内にを作成する必要がありますonPostExecute

于 2012-05-15T22:05:50.063 に答える