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」を選ぶと生成されるコードに、
asyncTestとasyncTestを呼ぶコードを追加したもの。
おしまい。
Leave a Comment