2016-10-26 12 views
-1

私は3つのタスクをAsyncTaskクラス内で実行しています。 3つのAsyncTaskクラスを使用せずに、これらのタスクを並列に実行したい。これは可能ですか?はいの場合、どうすればできますか?下に、私のAsyncTaskクラスとそのdoInBackgroundメソッドのコードスニペットがあります。AsyncTask内でタスクを並行して実行するにはどうすればよいですか?

private class AsyncBenchmarking extends AsyncTask<Void, Void, Integer> { 
    @Override 
    protected void onPreExecute() { 
     lockScreenOrientation(); 
     animateScreen(); 

     super.onPreExecute(); 
    } 

    @Override 
    protected Integer doInBackground(Void... params) { 

     firstTaskPerformance = objPrimeNumber.generatePrimeNumbers(); 
     secondTaskPerformance = objLinpack.linpackBenchmark(); 
     thirdTaskPerformance = objSuperPi.calculatePi(100000); 

     return; 
    } 
} 
+0

'AsyncTask'を使いたくない場合は、' AsyncTask'を取り除き、3つの 'Threads'を使います。 – CommonsWare

+0

'ExecutorService'を使って、あなたのタスク(' Runnable's)を実行してください。それは最高の選択肢です。 – Beloo

答えて

2

代わりにThreadを使用できます。

new Thread((new Runnable() { 

     @Override 
     public void run() { 
      //somecode 1 
     } 
    }).start(); 
new Thread(((new Runnable() { 

     @Override 
     public void run() { 
      //somecode 2 
     } 
    }).start(); 
new Thread(((new Runnable() { 

     @Override 
     public void run() { 
      //somecode 3 
     } 
    }).start(); 
+0

これらのasynctasksは連続して実行されます。 – njzk2

+0

@ njzk2、はい。あなたは正しく – Vyacheslav

+0

@ njzk2ですが、私はこれらの欠点のために 'asynctask'クラスを使うことはまれです。 – Vyacheslav

3

APIは言う:

初めて紹介されたとき、AsyncTasksは1つのバックグラウンドスレッドでシリアルに実行されました。 DONUTから始めて、これはスレッドのプールに変更され、複数のタスクを並列に動作させることができました。 HONEYCOMBを開始すると、タスクは1つのスレッド上で実行され、並列実行によって発生する一般的なアプリケーションエラーを回避します。

ので、並列実行のために:

@TargetApi(Build.VERSION_CODES.HONEYCOMB) // API 11 
void startMyTask(AsyncTask asyncTask) { 
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
     asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
    else 
     asyncTask.execute(params); 
} 

はそれが役に立てば幸い!

+0

http://stackoverflow.com/a/13800208/1979882 – Vyacheslav

関連する問題