android - View=DecorView@47b2334[Connecting] 未附加到窗口管理器
问题描述
我有一个使用 ProgressDialog 启动的 Android 应用程序,当它连接时它会启动一个计时器。该应用程序有时会崩溃,我收到以下错误:
java.lang.IllegalArgumentException: View=DecorView@47b2334[Connecting] not attached to window manager
at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:508)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:417)
at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:136)
at android.app.Dialog.dismissDialog(Dialog.java:446)
at android.app.Dialog.dismiss(Dialog.java:429)
at com.trackme.Post.onPostExecute(Post.java:145)
at com.trackme.Post.onPostExecute(Post.java:43)
at android.os.AsyncTask.finish(AsyncTask.java:667)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:684)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6816)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1563)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1451)
这是我的代码:
public class Post extends AsyncTask<Void,Void,String> {
private static String latitude, longitude;
final Handler handler = new Handler();
static Timer timer;
Context context;
ProgressDialog progressDialog;
private TimerTask doAsynchronousTask;
public Post(MainActivity context) {
this.timer = timer;
this.context = context;
progressDialog = new ProgressDialog(context);
}
@Override
protected void onPreExecute() {
progressDialog.setTitle("Connecting");
progressDialog.setMessage("Trying to connect to your server. Please wait...");
progressDialog.setCancelable(false);
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.show();
}
@Override
protected String doInBackground(Void... voids) {
doTimerTask();
}
@Override
protected void onPostExecute(String response) {
if (progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
private void doTimerTask(String trackingTimeInterval) {
doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@SuppressWarnings("unchecked")
public void run() {
String msg;
if (Post.latitude != null && Post.longitude != null) {
System.out.println(Post.latitude + "|" + Post.longitude);
}
}
});
}
};
timer.schedule(doAsynchronousTask, 0, 120000);
}
}
解决方案
当您尝试将进度对话框附加到已销毁或在后台的 Activity 时,会出现此错误。检查活动是否正在运行:
activity.isfinishing()
如果它是假的,那么附上progressdialog
.
@Override
protected void onPreExecute() {
progressDialog.setTitle("Connecting");
progressDialog.setMessage("Trying to connect to your server. Please wait...");
progressDialog.setCancelable(false);
progressDialog.setCanceledOnTouchOutside(false);
if(!context.isFinishing()){
progressDialog.show();
}
}