私は 2AsyncTask
を持っAsyncOne
ていAsyncTwo
ます。最初の AsyncTask バックグラウンド メソッドでは、文字列値を取得し、それを設定していonpostexecute
ます。
このようなitem = i.getname();
ここitem
にグローバル変数があります。
今、私はこの項目の値onpostexecute
を AsyncTwo のメソッドに設定していますが、そこに null が表示されますか?
アイテムの値を取得するには?
私は 2AsyncTask
を持っAsyncOne
ていAsyncTwo
ます。最初の AsyncTask バックグラウンド メソッドでは、文字列値を取得し、それを設定していonpostexecute
ます。
このようなitem = i.getname();
ここitem
にグローバル変数があります。
今、私はこの項目の値onpostexecute
を AsyncTwo のメソッドに設定していますが、そこに null が表示されますか?
アイテムの値を取得するには?
あなたがしていることはあなたのコードとグローバル変数のもので正しいです、ちょうどあなたの両方のasyncTaskが同時に実行モードになってはいけないことを確認してください.1番目のpostExecute()で2番目のタスクを開始してください。
非同期タスク2を開始するときは、非同期タスク1が終了していることを確認する必要があります。値を設定できるときにpublishProgressを呼び出して、タスク1で非同期タスク2を開始するよりも、アイテムを非同期タスク1のフィールドとして保持できますonProgressUpdate
。
あなたの説明から、バックグラウンドで実行されている2つの同時タスクがあり、task2はtask1の結果に依存しているようです。それらは同時に実行されているため、task2が task1 よりも先に終了する可能性があるため、 task2 が終了したときにtask1の結果が得られるという保証はありません。
2 つのタスクを同時に実行できるようにするには、 task1 のdoInBackround()
メソッドを同期し、 task1で同期getItem()
メソッドを提供します。
// in task1
private Object item; // instance variable to be set in doInBackground
protected synchronized Object doInBackground(Object... objects) {
// set item to some value here
item = ...;
}
public synchronized Object getItem () {
return item;
}
// in task2
protected Object doInBackground(Object... objects) {
// do work of task2
....
// when finishing our work, ready to get the result of task1.
// we don't call task1.getItem() in onPostExecute() to avoid possibly blocking the UI thread
Object item = task1.getItem();
// pass item to the onPostExecute method
}
上記のコードでは、task2はtask1が完了するまで待機し、task1よりも高速に実行された場合に結果を取得します。