スレッドに関するプログラムに関してご質問させてください。
現在私は、CallableとFutureTaskを用いて以下のような処理を実装したいと考えています。
1.ある値を返す処理を別スレッド(FutureTask)で実行
2.上記のスレッド実行中はWaitDialogを表示
3.上記のスレッドの実行が完了したらWaitDialogを消去
4.別スレッドから受け取った値の処理
この処理を以下のようなコードで記述してみましたが、
FutureTaskのget()を呼び出すとWaitDialogが表示されなくなります。
スレッドに関する知識が浅くて恐縮なのですが、
何か原因等お分かりでしたらご教授願えないでしょうか。
よろしくお願い致します。
---以下プログラム
@Override
public void onResume(){
super.onResume();
Callable<String> postCallable = new Callable<String>(){
@Override
public String call(){
String ret = "";
try {
/*時間かかる処理 */
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ret = "some value";
return ret;
}
};
final ExecutorService scheduler = Executors.newFixedThreadPool(1);
final FutureTask<String> futureTask = new FutureTask<String>(postCallable);
scheduler.execute(futureTask);
final ProgressDialog waitDialog = new ProgressDialog(context);
Handler h = new Handler();
h.post(new Runnable(){
@Override
public void run() {
waitDialog.setMessage("waiting");
waitDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
waitDialog.show();
}
});
try {
String s = futureTask.get();
Log.i("TEST", "get finish ");
waitDialog.dismiss();//ダイアログ終了
} catch (Exception e) {
e.printStackTrace();
}
}
こんにちは、元木です。
onResume() のコードブロックの中で「時間のかかる処理」の
結果を使おうとすると、処理が完了するまでメインスレッドを
・ブロックするか、
・終了条件を満たすまでループさせる
必要が生じます。どちらもメインスレッドを止めることになるので、避けることをおすすめします。
あと、蛇足ですが、ベタにHandler やRunnable を使うのでは
なく、AsyncTask の利用を検討してみてはいかがでしょうか?
バックグラウンドで何か実行させるのに便利なAPIが
用意されてます。
コードの可読性も増すと思いますよ。