我有一堆获取数据的异步任务。它们在执行时通过显示对话框来更新进度。有时这会导致应用在后台(不可见)时崩溃。我的代码在下面调用。在不完全重构对话框的情况下,我可以做哪些检查来防止应用程序崩溃?
这些在 DownloadAsyncTask 中声明并在构造函数中传递
protected ProgressDialog mDialog;
protected String mDialogMessage = "Loading Data";
protected ProgressBar progBar;
doInBackground() {
if ( mProgressBar != null && mProgressBar.getVisibility() == View.INVISIBLE) {
mUIThreadHandler.post(new Runnable() {
@Override
public void run() {
mProgressBar.setVisibility(View.VISIBLE);
}
});
} else if ( mDialog != null && !mDialog.isShowing() ) {
mUIThreadHandler.post(new Runnable() {
@Override
public void run() {
mDialog.setMessage(mDialogMessage);
mDialog.show();
}
});
}
}
然后onPostExecute()
:
@Override
protected void onPostExecute(DefaultHandler handler) {
super.onPostExecute(handler);
if ( progBar != null && progBar.getVisibility() == View.VISIBLE ) {
progBar.setVisibility(View.INVISIBLE);
} else if ( mDialog != null && mDialog.isShowing() ) {
try {
mDialog.dismiss();
} catch (Exception e) {
}
}
}
更新的崩溃日志:
12-20 15:19:15.802: E/AndroidRuntime(9529):
android.view.WindowManager$BadTokenException: 无法添加窗口——令牌android.os.BinderProxy@41a37908 无效;您的活动正在运行吗?12-20 15:19:15.802: E/AndroidRuntime(9529): 在 android.view.ViewRootImpl.setView(ViewRootImpl.java:567) 12-20 15:19:15.802: E/AndroidRuntime(9529): 在 android. view.WindowManagerGlobal.addView(WindowManagerGlobal.java:246) 12-20 15:19:15.802: E/AndroidRuntime(9529): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 12-20 15:19: 15.802: E/AndroidRuntime(9529): 在 android.app.Dialog.show(Dialog.java:281) 12-20 15:19:15.802: E/AndroidRuntime(9529): 在 com.*.DownloadAsyncTask$2.run(下载AsyncTask.java:119) 12-20 15:19:15.802: E/AndroidRuntime(9529): at android.os.Handler.handleCallback(Handler.java:725) 12-20 15:19:15.802: