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