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();
}
}