11

AsyncTasks の実行順序に関する問題に直面しています。

私の質問は:

AsyncTask の 2 つの実装があると仮定します: MyAsyncTask1MyAsyncTask2

次の方法で呼び出されます。

new MyAsyncTask1 ().execute ();
new MyAsyncTask2 ().execute ();

MyAsyncTask1 がMyAsyncTask2の前に実行されることは保証されてますか? 確かなことは、デフォルトのエグゼキューターであるSERIAL_EXECUTORが使用されているため、並列で実行されないことです。問題は実行の順序にあります: どちらが最初に実行されますか??

実行順序が決定されていない場合、AsyncTasks の実行順序を強制するにはどうすればよいですか??

私が必要とするのは、 MyAsyncTask2 の前にMyAsyncTask1を実行することです。これは、 MyAsyncTask2の前にMyAsyncTask1の execute を呼び出しているにもかかわらず、常にそうであるとは限りませ

私が実際に持っているのはカスタムアクティビティです:

public abstract class CustomActivity extends Activity {

    @Override
    protected void onCreate ( Bundle savedInstanceState ) {
        super.onCreate ( savedInstanceState );
        new MyAsyncTask2 ().execute ();
    }
}

そして、カスタム アクティビティから継承する別のアクティビティ:

public class MainActivity extends CustomActivity {

    @Override
    protected void onCreate ( Bundle savedInstanceState ) {
        new MyAsyncTask1 ().execute ();
        super.onCreate ( savedInstanceState );
    }
}

したがって、MainActivityを使用する場合、MyAsyncTask1はMyAsyncTask2の前に実行する必要があります。少なくともそれが必要な動作です。

4

6 に答える 6

5

2つのスレッド(基本的にAsyncTasks)が希望の順序で実行されるようにする唯一の方法は、最初のスレッドが終了したときに2番目のスレッドを開始することです。

あなたの場合、実装を抽象化し、AsyncTask1ので実際にAsyncTask2を呼び出す必要がないようにするにはonPostExecute(AnupとSanketが提案した方法であり、それらを混在させたい場合も問題ありません)、AsyncTask1を呼び出しますsuper.executeAsyncTask2()。ここで、executeAsyncTask2()はCustomActivityのメソッドです。 2番目のAsyncTaskを開始します

于 2012-11-05T08:10:50.353 に答える
3

任意の数のAsyncTaskを「チェーン」するために、私が行うことは、AsyncTaskにカスタムコールバックをパラメーターとして受け取らせることです。次のように定義する必要があります。

public interface AsyncCallback(){
    public void onAsyncTaskFinished();
}

AsyncTask実装コンストラクターには、次のようにパラメーターとしてAsyncCallbackが必要です。

private AsyncCallback callback;

public AsyncTaskImplementation(AsyncCallback callback){
    //Do whatever you're doing here
    this.callback = callback;
}

もちろん、より多くのパラメーターがある場合は、削除しないでください。

次に、の終わりの直前に、onPostExecuteこれを紹介します。

if (callback != null) callback.onAsyncTaskFinished();

したがって、コールバックを渡すと、AsyncTaskはメインスレッドでコールバックを実行します。コールバックを実行したくない場合は、パスするだけですnull

したがって、AsyncTaskチェーンを呼び出すには、次のように記述します。

new AsyncTask1(new AsyncCallback(){

    public void onAsyncTaskFinished(){
         new AsyncTask2(null).execute();
    }

}).execute();

これがお役に立てば幸いです;-)

于 2012-11-05T11:08:16.130 に答える
0

タスク1のonPostExecuteで2番目のタスクを次のように呼び出します

@Override
protected void onPostExecute(String string){//String or whatever u passed
    new MyAsyncTask2 ().execute ();
}
于 2012-11-05T08:08:04.143 に答える
0

onPostExecute()最初の Aysnc タスクの最後 (つまり、最初の非同期タスクのメソッドの最後) で 2 番目の Async タスクを呼び出します。

//first async task's onPostExecute method

onPostExecute()
{
//do your stuff and call second async task

new MyAsyncTask2 ().execute ();

}

これにより、最初のタスクの後に 2 番目のタスクがシンプルかつエレガントに実行されることが保証されます。

于 2012-11-05T08:05:40.660 に答える
-1

物事を複雑にしないで、デザインをシンプルでクリーンに保つようにしてください。両方のAsyncTask間の競合は、オーバーライドされたメソッド内で実行される処理の量によって異なります。論理的には、AsyncTask1をAsyncTask2の前に完了させたい場合は、最初の非同期の中に2番目の非同期のコードブロックを追加するだけです。

または、最初のAsyncのonPostExecuteから2番目のAsyncを起動しますが、個人的にはそれは不要のようです。

于 2012-11-05T08:08:03.707 に答える
-1

AsyncTask はバックグラウンドで実行されるため、最初のコードは task1 を開始し、すぐに task2 を開始します。

new MyAsyncTask2 ().execute ();

これは Task1 の postexecute に

于 2012-11-05T08:05:25.877 に答える