数日間試行錯誤した後、ProgressDialogs を処理する最善の方法を見つけました。単純な ProgressDialogs を扱うことは、Android プラットフォームでは非常に複雑です。うまくいけば、将来的には(ドキュメントとともに)改善されるでしょう。これが私のベストプラクティスです。
空のダイアログ内の ProgressDialog のネストの問題は、2.1 または 2.2 システムで実行されている 2.0 より前のコードの問題のようです。show() メソッドが super.show() も呼び出していると推測できますが、これは 2.1 と 2.2 で異なる動作をします。
そのため、ProgressDialog オブジェクトで直接 show() を呼び出さない場合に最適であることがわかりました。代わりに、組み込みの showDialog() および onCreateDialog() メソッドを使用してダイアログを操作します。コード スニペットを次に示します。
private static final int ID_DIALOG_LOADING = 0;
@Override
protected void onCreate(Bundle tedBundy) {
// Do stuff
showDialog(ID_DIALOG_LOADING);
// Do more stuff in a thread
}
@Override
public void run() {
// Do some stuff in this thread
handler.sendEmptyMessage(0);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// Let adapters know the data under them have changed
try {
dimissDialog(ArticlesList.ID_DIALOG_LOADING);
removeDialog(ArticlesList.ID_DIALOG_LOADING);
} catch (Exception e) {}
}
}
@Override
protected Dialog onCreateDialog(int id) {
if (id == ID_DIALOG_LOADING) {
ProgressDialog loadingDialog = new ProgressDialog(this);
loadingDialog.setMessage("Loading...");
loadingDialog.setIndeterminate(true);
loadingDialog.setCancelable(true);
return loadingDialog;
}
return super.onCreateDialog(id);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
try {
Log.i("ArticlesList.onSaveInstanceState", "Chirp chirp");
dismissDialog(ArticlesList.ID_DIALOG_LOADING);
removeDialog(ArticlesList.ID_DIALOG_LOADING);
} catch (Exception e) {
}
super.onSaveInstanceState(outState);
}
@Override
protected void onDestroy() {
try {
dismissDialog(ArticlesList.ID_DIALOG_LOADING);
removeDialog(ArticlesList.ID_DIALOG_LOADING);
} catch (Exception e) {
}
super.onDestroy();
}
@Override
protected void onPause() {
try {
dismissDialog(ArticlesList.ID_DIALOG_LOADING);
removeDialog(ArticlesList.ID_DIALOG_LOADING);
} catch (Exception e) {
}
super.onPause();
}
@Override
public void onDetachedFromWindow() {
try {
dismissDialog(ArticlesList.ID_DIALOG_LOADING);
removeDialog(ArticlesList.ID_DIALOG_LOADING);
} catch (Exception e) {
}
super.onDetachedFromWindow();
}
これは長いコード スニペットです。また、そのダイアログを強制終了しようとしている重複したコードの束も表示されます。これは、携帯電話が回転するたびに Android が View を破棄してから再作成するためです。うまくいけば、将来のバージョンでは、ユーザーが画面を回転させるたびにウィンドウが完全に破棄されて再ロードされなくなり、代わりに onScreenRotate() メソッドが実装されます。
いくつかの異なる方法を試した後、このハッキーなソリューションは、ProgressDialog を削除する一貫した迅速な結果を提供する唯一のもののようです。これにより、将来誰かの時間が数日節約されることを願っています。