Android の Java では、普通に Thread を使って動かすと「突然止まりました」エラーで動かなくなる。Thread 中から UI を呼び出してはいけないルールになっているらしい。で、Thread を検索語にして探索すると、迷路に入る(入った)ので注意。スレッド管理は、AsyncTask<Params, Progress, Result> を使用すると楽ができるように設計されている。

AsyncTask | Android Developers

まずは Main にタスクを定義する。

private class NewTask extends AsyncTask<String, Void, Void>

3つの Generic は、それぞれ、実行開始時(doInBackGround)、実行している途中(onProgressUpdate)、実行後の処理(onPostExecute)に渡される引数を定義する。

実行は4つのステップに分かれる。 onPreExecute(), doInBackground(Params…), onProgressUpdate(Progress…), onPostExecute(Result) で、このうち、doInBackGround で UI にアクセスすることが禁止される。

doInBackGround の戻り値が onPostExecute に渡されるので、Result が doInBackGround の型も決定する。doInBackGround 内で、publishProgress( ) に Progress を渡してやれば、onProgressUpdate が呼び出される。

それぞれのメソッドを定義して、UI 側から Params を与えて呼び出せば、あとは勝手にやってくれる。実例は以下のとおり:

new NewTask().execute("test");


private class NewTask extends AsyncTask<String, Void, Void>
{
	private final ProgressDialog dialog = new ProgressDialog(Main.this);
	protected void onPreExecute() {
		this.dialog.setMessage("Inserting data...");
		this.dialog.show();
	}

	@Override
	protected Void doInBackground(String... arg0) {
	}

	protected void onPostExecute(final Void notused) {
		if( this.dialog.isShowing() )
			this.dialog.dismiss();
	}
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です