AsyncTaskで処理が完了した後にcancelを呼ぶと?

知ってる人は、知ってると思うんだけど、
一応、コードを書いて確認してみた。

package your.domain.asynctest;

import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate( R.menu.menu_main, menu );
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if ( id == R.id.action_settings ) {
            asyncTest();
            return true;
        }

        return super.onOptionsItemSelected( item );
    }

    private void asyncTest() {
        AsyncTask<Integer, Integer, Integer> asyncTask = new AsyncTask<Integer, Integer, Integer>() {
            @Override
            protected Integer doInBackground(Integer... params) {
                for (Integer i: params) {
                    Log.d( "MainActivity", "i = " + i.intValue() );
                }

                return new Integer( 0 );
            }

            @Override
            protected void onCancelled() {
                Log.d( "MainActivity", "onCancelled" );
            }

            @Override
            protected void onPostExecute(Integer i) {
                Log.d( "MainActivity", "onPostExecute" );
            }
        };

        asyncTask.execute( 1, 2, 3 );

        try {
            Thread.sleep( 1000 );
        } catch (InterruptedException e) {}

        asyncTask.cancel( false );
    }
}

こんな感じのテストを書いて、実行してみた。
処理が完了するのを十分に待ってからAsyncTask#cancelを呼ぶと、
onPostExecuteではなく、onCancelledが呼ばれる。
すべてUIスレッドで動作してるから、
onPostExecuteが呼ばれる前ならキャンセルできるってことだろうけど、
念のため確認してみた。

ちなみに、
このコードはAndroid Studioを使って新規にプロジェクトを作る時に、
「Blank Activity」を選ぶと生成されるコードに、
asyncTestasyncTestを呼ぶコードを追加したもの。

おしまい。

Leave a Comment