Android開発において、AsyncTaskで直列処理と並列処理について、ほぼ同時に動いた時はどのような動きになるのか、実際に順番は保証されるのかわからなかったので、軽くコードを組んでみて確認してみましたので、メモとして残しておきたいと思います。
【参考URL】
developer - AsyncTask
Android - AsyncTaskの直列処理?並列処理?
AsyncTaskの非同期処理はどのように実現しているのか
#【試作1】タスク1:直列処理、タスク2:並列処理の場合
task1:execute()
task2:executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
// 1つ目の非同期タスク
AsyncTask task1 = new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
Log.v("task1", "start!!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Log.v("task1", "done!!!");
}
}
.execute();
// 2つ目の非同期タスク
AsyncTask task2 = new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
Log.v("task2", "start!!!");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Log.v("task2", "done!!!");
}
}
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
#実行結果
順番通りになっているかを確認するため、数回実行してみました。
【1回目】
5970-5995/com.example.testcode V/task2: start!!!
5970-5994/com.example.testcode V/task1: start!!!
5970-5970/com.example.testcode V/task2: done!!!
5970-5970/com.example.testcode V/task1: done!!!
【2回目】
7138-7157/com.example.testcode V/task2: start!!!
7138-7156/com.example.testcode V/task1: start!!!
7138-7138/com.example.testcode V/task2: done!!!
7138-7138/com.example.testcode V/task1: done!!!
【3回目】
7383-7403/com.example.testcode V/task1: start!!!
7383-7404/com.example.testcode V/task2: start!!!
7383-7383/com.example.testcode V/task2: done!!!
7383-7383/com.example.testcode V/task1: done!!!
2回目のスタートが逆になっていますね。。。
#【試作2】タスク1:並列処理、タスク2:直列処理の場合
task1:executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
task2:execute()
※ソースコードは試作1とほぼ変わりません。
// 1つ目の非同期タスク
AsyncTask task1 = new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
Log.v("task1", "start!!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Log.v("task1", "done!!!");
}
}
.execute();
// 2つ目の非同期タスク
AsyncTask task2 = new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
Log.v("task2", "start!!!");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
Log.v("task2", "done!!!");
}
}
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
#実行結果
こちらも順番通りになっているかを確認するため、数回実行してみました。
【1回目】
7267-7273/com.example.testcode V/task2: start!!!
7267-7272/com.example.testcode V/task1: start!!!
7267-7267/com.example.testcode V/task2: done!!!
7267-7267/com.example.testcode V/task1: done!!!
【2回目】
7643-7662/com.example.testcode V/task1: start!!!
7643-7663/com.example.testcode V/task2: start!!!
7643-7643/com.example.testcode V/task2: done!!!
7643-7643/com.example.testcode V/task1: done!!!
【3回目】
7871-7891/com.example.testcode V/task1: start!!!
7871-7892/com.example.testcode V/task2: start!!!
7871-7871/com.example.testcode V/task2: done!!!
7871-7871/com.example.testcode V/task1: done!!!
こちらの実行結果も試作1と似たような結果となっています。
#まとめ
直列処理と並列処理をほぼ同時に実行した場合の処理の順番は保証されないようです。
確実に順番を保証したい場合は、両方とも直列処理で行ったほうが良いですね。
#最後に
それ違うぞ!っという点もあるかと思いますが、参考程度になれば幸いです。
以上です。