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

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)

当前回答

这个问题的答案都是正确的,但让我有点困惑,不知道为什么。在玩了大约2个小时后,我发现了这个错误的原因:

你已经知道,从阅读其他答案,有X已泄漏窗口DecorView@d9e6131[]错误意味着一个对话框打开时,你的应用程序关闭。但是为什么呢?

它可能是,当你的对话框打开时,你的应用程序因为其他原因崩溃了

这导致你的应用程序关闭,因为你的代码中的一些错误,这导致对话框保持打开的同时,你的应用程序关闭,由于其他错误。

所以,仔细检查你的逻辑。解决第一个错误,然后第二个错误会自己解决

一个错误导致另一个错误,又导致另一个错误,就像DOMINOS!

其他回答

确保打电话 this.dialog.show。(活动)

当我在AsyncTask中使用ProgressDialog时,这种情况发生在我身上。实际上,我在onPostExecute中使用hide()方法。基于@Alex Volovoy的答案,我需要使用遣散()与ProgressDialog删除它在onPostExecute和它完成。

progressDialog.hide(); // Don't use it, it gives error

progressDialog.dismiss(); // Use it

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

解决方案是在退出Activity之前在view .java:183中创建的对话框上调用dismiss(),例如在onPause()中。所有的窗口和对话框应该在离开一个活动之前关闭。

窗口泄漏异常有两个原因:

1)当Activity上下文不存在时显示对话框,为了解决这个问题,你应该只显示你确定Activity存在的对话框:

if(getActivity()!= null && !getActivity().isFinishing()){
        Dialog.show();
}

2)对话框不适当解散,解决使用以下代码:

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