活动泄漏了最初添加的窗口

这是什么错误,为什么会发生?

05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.ViewRoot.<init>(ViewRoot.java:231)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.Dialog.show(Dialog.java:239)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.mypkg.myP$PreparePairingLinkageData.onPreExecute(viewP.java:183)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.os.AsyncTask.execute(AsyncTask.java:391)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.mypkg.myP.onCreate(viewP.java:94)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.access$2200(ActivityThread.java:126)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.os.Looper.loop(Looper.java:123)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.main(ActivityThread.java:4595)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at java.lang.reflect.Method.invokeNative(Native Method)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at java.lang.reflect.Method.invoke(Method.java:521)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at dalvik.system.NativeStart.main(Native Method)

答案

您试图退出活动后显示对话框。

[编辑]

这个问题是 android 开发人员在 Google 上搜索最多的问题之一,因此在评论中添加了一些要点,而无需深入地进行评论对话,这可能对将来的研究者更有帮助。

答案 1

您试图退出活动后显示对话框。

答案 2

在某些情况下(尽管答案仍然是完全正确的),该错误可能会引起误解 - 例如,在我的情况下,在 AsyncTask 中引发了未处理的 Exception,这导致 Activity 关闭,然后打开进度对话框导致了此 Exception。 “真正的” 异常在日志中稍早一些

答案 3

在退出 Activity 之前,在您创建的 Dialog 实例上调用 dismiss(),例如在 onPause()或 onDestroy()中

解决方案是在退出Activity之前,在viewP.java:183 dismiss() ,在viewP.java:183创建的Dialog上调用dismiss() onPause() 。离开 “ Activity之前,应关闭所有 “ Window和 “ Dialog

如果使用AsyncTask ,则该日志消息可能具有欺骗性。如果您在日志中查找,则可能会发现另一个错误,可能是AsyncTask doInBackground()方法中的一个错误,这使您当前的Activity doInBackground() ,因此,一旦AsyncTask回来。休息。其他一些用户已经在这里解释了:-)

我通过在AlertDialog上错误地调用hide()而不是dismiss()触发了此错误。

您可以通过一个简单 / 愚蠢的错误来获取此异常,例如,如果您错过了 switch 语句中的 break 调用语句,则在显示AlertDialog之后意外地调用finish() ……

@Override
   public void onClick(View v) {
    switch (v.getId()) {
        case R.id.new_button:
            openMyAlertDialog();
            break; <-- If you forget this the finish() method below 
                       will be called while the dialog is showing!
        case R.id.exit_button:
            finish();
            break;
        }
    }

finish()方法将关闭Activity ,但AlertDialog仍在显示!

因此,当您专心盯着代码,寻找不良的线程问题或复杂的编码等时,请不要对树木视而不见。有时,它就像丢失的 break 语句一样简单而愚蠢。 :)

这个问题的答案都是正确的,但是让我真正理解为什么有点困惑。在玩了大约 2 个小时后,出现此错误的原因(就我而言)使我感到震惊:

通过阅读其他答案,您已经知道X has leaked window DecorView@d9e6131[]错误表示关闭应用程序时打开了对话框。但为什么?

对话框打开时,您的应用可能因其他原因崩溃了

由于代码中的某些错误,这导致您的应用程序关闭,由于另一个错误,导致对话框在您的应用程序关闭的同时保持打开状态。

因此,请仔细阅读您的逻辑。解决第一个错误,然后第二个错误将自行解决在此处输入图片说明

一个错误会导致另一个错误,而另一个会导致另一个错误,例如 DOMINOS!

退出活动后尝试显示对话框时会出现此问题。

我只是通过写下以下代码解决了这个问题:

@Override
public void onDestroy(){
    super.onDestroy();
    if ( progressDialog!=null && progressDialog.isShowing() ){
        progressDialog.cancel();
    }
}

基本上,从哪个类启动 progressDialog,重写 onDestroy 方法并执行此方法。它解决了 “活动已泄漏窗口” 的问题。

我最近遇到了同样的问题。

此问题背后的原因是,该活动在关闭对话框之前已关闭。发生上述情况的原因多种多样。上面帖子中提到的内容也是正确的。

我陷入困境,因为在线程中,我正在调用一个引发异常的函数。因此,窗口被关闭了,因此是例外。

活动销毁时关闭对话框

@Override
protected void onDestroy()
{
    super.onDestroy();
    if (pDialog!=null && pDialog.isShowing()){
        pDialog.dismiss();
    }
}

这可能会有所帮助。

if (! isFinishing()) {

    dialog.show();

    }