AsyncTaskのcancel時の動き
2011 年 5 月 11 日
コメントはありません
Android 2.1 update 1 ~ Android 2.3.2
AsyncTaskのcancel(true)を外部から呼んだ場合と、doInBackgroundで呼んだ場合挙動が異なる。
あと、cancelしてもdoInBackgroundは最後まで実行される。
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new AsyncTask<Void, Integer, Void>() {
@Override
protected Void doInBackground(Void... params) {
for (int i = 0, cnt = 10; i < cnt; i++) {
publishProgress(i);
SystemClock.sleep(1000);
if (i == 5) {
cancel(true);
}
}
return null;
}
@Override
public void onProgressUpdate(Integer... values) {
Log.d(getLocalClassName(), "count "+values[0]);
}
@Override
protected void onCancelled() {
Log.d(getLocalClassName(), "onCancelled");
}
@Override
protected void onPostExecute(Void result) {
Log.d(getLocalClassName(), "onPostExecute");
}
}.execute();
}
}
結果
count 0 count 1 count 2 count 3 count 4 count 5 onPostExecute count 6 count 7 count 8 count 9
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
AsyncTask<Void, Integer, Void> task = new AsyncTask<Void, Integer, Void>() {
@Override
protected Void doInBackground(Void... params) {
for (int i = 0, cnt = 10; i < cnt; i++) {
publishProgress(i);
SystemClock.sleep(1000);
}
return null;
}
@Override
public void onProgressUpdate(Integer... values) {
Log.d(getLocalClassName(), "count "+values[0]);
}
@Override
protected void onCancelled() {
Log.d(getLocalClassName(), "onCancelled");
}
@Override
protected void onPostExecute(Void result) {
Log.d(getLocalClassName(), "onPostExecute");
}
};
task.execute();
SystemClock.sleep(5000);
task.cancel(true);
}
}
結果
count 0 count 1 count 2 count 3 count 4 onCancelled count 5 count 6 count 7 count 8 count 9