首页 > 解决方案 > 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);
    }

}

标签: android

解决方案


当您尝试将进度对话框附加到已销毁或在后台的 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();
         }

    }

推荐阅读