私は一度に6つから始めasyncTasks
ています。しかし、私の問題は、どの非同期タスクonPostExecute()
が返されるかをどうやって知ることができるかということです。
3 に答える
IMO この場合の最善の解決策は、コールバックで何らかの種類を各 に渡すことAsyncTask
です。方法は次のとおりです。
コールバック インターフェイスを作成します。
public interface OnTaskCompleteListener() { public void onTaskComplete(Void result); }
次に、このコールバックを のコンストラクタ パラメータとして追加します
AsyncTask
。public class MyAsyncTask extends AsyncTask { private OnTaskCompleteListener listener; public MyAsyncTask(OnTaskCompleteListener listener){ this.listener=listener; } @Override protected void onPostExecute(Void result) { if (this.listener!=null) { this.listener.onTaskComplete(result); } } }
最後に、 をインスタンス化するときに、
AsyncTask
各インスタンスにコールバックの実装を提供します。//instance 1 new MyAsyncTask(new OnTaskCompleteListener() { public void onTaskComplete(Void result) { //do something with the result } }).execute(); //instance 2 new MyAsyncTask(new OnTaskCompleteListener() { public void onTaskComplete(Void result) { //do something completely different here //this code doesn't interfere in any way with instance 1 } }).execute();
それぞれのコールバックを実装する義務はないことに注意してくださいAsyncTask
。実装は共有できます。
最初に導入されたとき、AsyncTasks は単一のバックグラウンド スレッドでシリアルに実行されました。DONUT 以降、これはスレッドのプールに変更され、複数のタスクが並行して動作できるようになりました。HONEYCOMB 以降、並列実行によって発生する一般的なアプリケーション エラーを回避するために、タスクは単一のスレッドで実行されます。
本当に並列実行が必要な場合は、 を呼び出すことができますexecuteOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR
。
詳細については。 http://developer.android.com/reference/android/os/AsyncTask.html
public final AsyncTask<Params, Progress, Result> executeOnExecutor (Executor exec, Params... params)
API レベル 11 で追加 指定されたパラメーターでタスクを実行します。呼び出し元がそれへの参照を保持できるように、タスクはそれ自体 (this) を返します。
このメソッドは通常THREAD_POOL_EXECUTOR
、AsyncTask によって管理されるスレッドのプールで複数のタスクを並行して実行できるようにするために使用されますが、カスタム動作のために独自の Executor を使用することもできます。
警告:スレッド プールから複数のタスクを並行して実行できるようにすることは、一般的に望ましくありません。操作の順序が定義されていないためです。たとえば、これらのタスクを使用して一般的な状態を変更する場合 (ボタンのクリックによるファイルの書き込みなど)、変更の順序は保証されません。注意して作業しないと、まれに、新しいバージョンのデータが古いバージョンによって上書きされ、不明瞭なデータ損失や安定性の問題が発生する可能性があります。このような変更は、順次実行するのが最適です。プラットフォームのバージョンに関係なく、このような作業がシリアル化されることを保証するために、この関数を で使用できますSERIAL_EXECUTOR
。
このメソッドは、UI スレッドで呼び出す必要があります。
myTask extends AsyncTask{
int mTag;
public AsyncTas(int tag){
this.mTag = tag;
}
@Override protected void onPostExecute(Void arg0) {
super.onPostExecute(arg0);
switch(tag){ .... }
}
}