アーカイブ

‘AsyncTask’ タグのついている投稿

AsyncTaskのcancel時の動き

2011 年 5 月 11 日 コメント 1 件

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() {
@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(); } } [/java] 結果

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 task = new AsyncTask() {
@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); } } [/java] 結果

count 0
count 1
count 2
count 3
count 4
onCancelled
count 5
count 6
count 7
count 8
count 9
カテゴリー: android タグ: ,