ProgressDialogでshow()メソッドを呼び出してもダイアログが表示されない
経緯:
CameraActivityで写真を撮影後、時間のかかるマッチング処理をしてから次のActivityへ遷移していた。マッチング中に何も表示されないSurfaceViewが非常に不親切だったのでProgressDialogクラスで待機用のダイアログを表示してみることにした。
問題点:
下記のコードだと"時間のかかる処理"が完了していないのにThreadの並行処理で、次のActivityへ遷移してしまう。
try {
progressDialog = new ProgressDialog( CameraActivity.this );
progressDialog.setMessage( "計算中... " );
progressDialog.setProgressStyle( ProgressDialog.STYLE_SPINNER );
thread = new Thread( calc_thread );
progressDialog.show();
thread.start();
// 次のActivityへの遷移処理・・・
}
catch ( IOException e ) {
}
/* 中略 */
Runnable calc_thread = new Runnable() {
@Override
public void run()
{
Log.i( "calc_thread", "start!" );
// 時間のかかる処理
progressDialog.dismiss();
}
};
解決策として良さげなものにThreadクラスのjoin()メソッドを見つけた。このメソッドは呼び出したスレッドの処理が完了するまで呼び出し側の処理を停止する、という機能を持つ。下記のようにコードを変更した。
try {
progressDialog = new ProgressDialog( CameraActivity.this );
progressDialog.setMessage( "計算中... " );
progressDialog.setProgressStyle( ProgressDialog.STYLE_SPINNER );
thread = new Thread( calc_thread );
progressDialog.show();
try {
thread.start();
thread.join();
}
catch ( InterruptedException e ) {
}
// 次のActivityへの遷移処理・・・
}
catch ( IOException e ) {
}
/* 中略 */
Runnable calc_thread = new Runnable() {
@Override
public void run()
{
Log.i( "calc_thread", "start!" );
// 時間のかかる処理
progressDialog.dismiss();
}
};
無事、時間のかかる処理の完了後に次のActivityが表示されるようになった。
しかし、ダイアログが表示されなくなってしまった。
苦肉の策として下記のようにrun()メソッド内で遷移処理を行うことにした。
Runnable calc_thread = new Runnable() {
@Override
public void run()
{
Log.i( "calc_thread", "start!" );
// 時間のかかる処理
progressDialog.dismiss();
// 次のActivityへの遷移処理
}
};
ダイアログは表示されたが「join()メソッド使用時にダイアログが表示されない」という疑問は残ったままである。