アーカイブ

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

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
カテゴリー: android タグ: ,