7

2つのasynタスクを実装しました。android4.0を使用しています。1つのasyntaskが継続的に実行される場合、2番目のasyntaskは要件に基づいて実行されます(複数回の場合もあります)。例えば。

class AsynTask1 exetends AsyncTask<Void, Bitmap, Void>{
    protected Void doInBackground(Void... params) {
        while(true){
            publishProgress(bmp);
        }
    }
}

class AsynTask2 extends AsyncTask<String, Void,Void>{
    protected Void doInBackground(String... params){
        System.out.println(params[0])
    }
}

アクティビティクラスで

class MainActivity extends Activity{
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new AsynTask1().execute();

        int i=0;
        while(i<100)
        {
            if(i%2==0)
            new AsynTask2().execute("no is even"+i);
            i++
        }
    }
}     

上記の場合、AsynTask2は実行されません。

executeOnExecutor(AsyncTask.THREAD_POOL_Executor、params)を試してみると、両方のasyntaskが実行され、AsynTask2から印刷メッセージを取得していますが、順序が正しくありません(0 2 6 4 10 8 12 14 ....など)。

AsynTask1とAsynTask2を順番に実行して、順序(0 2 4 6 8 10 12 14 ....など)が防止されるようにする方法はありますか。

ありがとう&よろしくミニ。

4

4 に答える 4

5

Asynctask2にはSERIAL_EXECUTOR を使用します

 new AsynTask2().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR ,"no is even"+i)

編集:Asynctask1に使用して、同じエグゼキュータが使用されないようにします

 new AsynTask1().executeOnExecutor(AsyncTask.THREAD_POOL_Executor,params);
于 2012-08-24T08:38:55.587 に答える
0

コールバックを使用してみてください。AsyncTaskクラスでインターフェースを定義し、それらをメインクラスに実装します。AsyncTask2のonPostExecuteでcallBackを使用して、次のAsyncTask2を起動します。注文を保証します。

 class AsyncTask2 extends AsyncTask<String, Void,Boolean<{
        //Your code. doInBackground must now return a boolean.
        protected Void onPostExecute(final Boolean success){
            myCallback listener = (myCallback) parentActivity;
            listener.call();
        }

        public Interface myCallback{
            void call();
        }
 }

次に、メインアクティビティでmyCallbackを実装します。

[編集]

これがあなたができることのサンプルです。

Class MainActivity extends Activity implements myCallback{
    //Your code
    public void call(){
       new AsyncTask2().execute("no is even" + i);
    }
}
于 2012-08-24T08:37:00.423 に答える
0
  1. 長時間実行されるスレッド(AsyncTask1を実装する方法)にAsyncTaskを使用することは想定されていません。ドキュメントを参照してください:http://developer.android.com/reference/android/os/AsyncTask.html。AsyncTask1が実行していることのために別のスレッドを作成するだけです。

  2. AsyncTask2で実行していることをシリアル実行する必要があるため、サイズ1のThreadPoolを作成することで実行できます。

    // Creating ThreadPool
    ExecutorService service = Executors.newFixedThreadPool(1);
    
    // Submitting task
    service.execute(task);
    
    // Shutting down the thread pool when not required.
    service.shutdown();
    
于 2012-08-24T09:35:23.337 に答える
-2
    int i=0;
    while(i<100)
    {
      new AsynTask1().execute();
        if(i%2==0)
      {
        new AsynTask2().execute("no is even"+i);
       }
        i++
    }
于 2012-08-24T08:37:55.557 に答える