经过几天的折腾,我找到了处理 ProgressDialogs 的最佳方法。在 Android 平台上处理简单的 ProgressDialog 肯定过于复杂,但这并不意味着我们有任何理由不使用它们。希望它在未来会变得更好(连同文档一起)。这是我的最佳实践。
ProgressDialog 在空白对话框中的嵌套问题似乎是在 2.1 或 2.2 系统上运行的 pre-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 会在手机旋转时销毁然后重新创建视图。希望在未来的版本中,每当用户旋转屏幕时,窗口不会被完全销毁并重新加载,而是实现 onScreenRotate() 方法。
在尝试了几种不同的方法之后,这个 hacky 解决方案似乎是唯一能够提供一致、快速的结果来删除 ProgressDialog。希望这可以节省未来几天的时间。