package jp.mixi.sample.async.asynctask;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// AsyncTask のインスタンスを生成し、非同期処理を実行する
new MyAsyncTask().execute();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* 非同期処理を実行するためのネストクラス。
* Activity などのライフサイクルに合わせた管理は自分でする必要があるが、
* この例では特にしていないので、Activity が GC されると良くないことが起こる。
*
* ジェネリクスの仕組みを用いて、非同期処理に渡す引数の型、進捗を監視するコールバック用の型、非同期処理の結果を表す型を指定する。
*
* @author keishin.yokomaku
*/
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
/**
* 非同期処理を実行する前に UI スレッドで実行する処理を書く
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
Toast.makeText(MainActivity.this, "onPreExecute", Toast.LENGTH_SHORT).show();
}
/**
* 非同期処理の進捗を受け取るコールバック。
*/
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
Toast.makeText(MainActivity.this, "onProgressUpdate", Toast.LENGTH_SHORT).show();
}
/**
* 非同期処理の本体で、UI スレッドではない別のスレッドで処理する内容。
* 引数は非同期処理内容に渡すためのパラメータの配列。
*/
@Override
protected Void doInBackground(Void... params) {
try {
publishProgress();
Thread.sleep(2000L);
publishProgress();
Thread.sleep(2000L);
publishProgress();
Thread.sleep(2000L);
publishProgress();
Thread.sleep(2000L);
publishProgress();
Thread.sleep(2000L);
publishProgress();
} catch (InterruptedException e) {
Log.e(MyAsyncTask.class.getSimpleName(), "thread interrupted: ", e);
}
return null;
}
/**
* 非同期処理の実行後に、UI スレッドで実行する処理。
* 引数は {@link AsyncTask#execute(Object...)} の返り値。
*/
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Toast.makeText(MainActivity.this, "onPostExecute", Toast.LENGTH_SHORT).show();
}
}
}