メモリリークの対処法(再びAsyncTask#cancel(false)は、isCanceledをtrueに
セットして、実行中のタスクが終わるまで待機する。
AsyncTask#cancel(true)にしても、即座にスレッドが
終了することを保証しない。
private static class MyTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
for (int i=0; i<NUM_TASKS; i++) {
if (this.isCancelled()) {
return null;
} else {
try {
// Do any task
} catch (InterruptedException iex) {
// the blocking method throws an InterruptedException
return null;
}
}
}
return "AsyncTask Done";
}
}
17.
AsyncTask の罠 (その4)
AsyncTask を複数実行したときに、逐次実行される
(sequential)か、同時実行される(concurrent)かは、呼
び出し方、APIレベルで変わる
実行環境はアプリケーション全体で同一(ある Service の
AsyncTask が別 Activity の AsyncTask をブロックしうる)
API targetSdkVersion execute executeOnExecutor
1-3 Any Sequential Not available
4-10 Any Concurrent Not available
11-12 Any Concurrent Sequential/Concurrent (customizable)
13+ <13 Concurrent Sequential/Concurrent (customizable)
13+ ≥13 Sequential Sequential/Concurrent (customizable)
18.
API レベルに関わらず処理を
同じにするには
逐次実行
2.3系をサポートする限り無理です。AsyncTaskを諦めてく
ださい。
同時実行
targetSdkVersion を < 13 にするか、API レベルによって処理
を変える必要があります。
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB_MR1) {
new MyAsyncTask().execute();
} else {
new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}