题 活动已泄露最初添加的窗口


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

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)

933
2018-05-17 15:51


起源


另一个经典是当方向改变时: stackoverflow.com/questions/1111980/... - rds


答案:


退出活动后,您正试图显示一个Dialog。

[编辑]

这个问题是google for android开发者的热门搜索之一, 因此,从评论中添加一些重要的观点,这可能对未来的调查员更有帮助,而无需进行深入的评论对话。

答案1 :

退出活动后,您正试图显示一个Dialog。

答案2 

在某些情况下,这个错误可能会有点误导(尽管如此)   答案仍然是完全准确的) - 即在我的情况下   未处理的异常被抛入AsyncTask,导致了   要关闭的活动,然后打开progressdialog导致这个   例外..所以“真正的”例外在日志中早一点

答案3 

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


1269
2018-05-17 15:54



答案3效果很好。解雇() - sudharsan chandrasekaran
@Override public void onStop(){if(dialog!= null){dialog.dismiss(); dialog = null; }} - Md.Tarikul Islam


解决方案是打电话 dismiss() 在...上 Dialog 你创建的 viewP.java:183 在退出之前 Activity,例如在 onPause()。所有 WindowS&Dialog应该在离开之前关闭 Activity


371
2018-05-17 18:50



那么当用户旋转手机时,所有的对话都应该被解雇?这听起来不对。 - LarsH
@LarsH你可以看到,我的答案是在7年多前写的,当时这肯定是正确的。我不再使用Android,而是基于我所看到的 文件,它可能仍然是这样,但Android已经走了很长一段路(引入片段只是为了命名一个),所以现在可能更容易了。 - Márton Molnár


如果你正在使用 AsyncTask,可能该日志消息可能具有欺骗性。如果您查看日志,可能会发现另一个错误,可能是您的错误 doInBackground() 你的方法 AsyncTask,这是你的当前 Activity 炸毁,因此一旦 AsyncTask 回来..好吧,你知道其余的。其他一些用户已在此处解释:-)


100
2017-07-20 18:23



有时在这种情况下,我无法看到真正的异常。要找到真正的异常,只需注释progressDialog.show()并再次运行应用程序..现在你看到了它。 - Stuck


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

   @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 还在显示!

因此,当你专心盯着代码,寻找糟糕的线程问题或复杂的编码等时,不要忘记树木的森林。有时它可能只是一个简单而愚蠢的东西,就像一个缺失的断言。 :)


52
2017-10-08 08:48



当我想从警报对话框中完成活动时,我得到泄漏:\ ... - RelativeGames
或多或少正是我的问题。在创建对话框后调用onError完成,而不是onClick for dismiss按钮。 - jbass


我错误地拨打了这个错误 hide() 代替 dismiss() 在...上 AlertDialog


48
2017-12-07 19:29



究竟是怎么回事我。此外,调用hide()然后将对话框设置为null也不是有效的替代方法。 - Lucas Tulio
同样在这里:D ...... - mallaudin
我真的知道这背后的问题。但是打电话给dismiss()帮助了我! - Karoly


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

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

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

基本上,从哪个类开始progressDialog,覆盖onDestroy方法并以这种方式执行。它解决了“活动已泄露窗口”的问题。


27
2017-08-30 06:55



不保证会调用onDestroy。最好将该代码放在onPause或onStop中 - Amruta-Pani


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

这个问题背后的原因是在关闭对话框之前关闭了活动。 上述情况有多种原因发生。上面帖子中提到的那些也是正确的。

我遇到了一个情况,因为在线程中,我正在调用一个抛出异常的函数。因为窗户被解雇,因此例外。


19
2017-12-08 21:12





我有同样晦涩的错误信息,不知道为什么。根据之前答案的线索,我将我的非GUI调用mDialog.finish()更改为mDialog.dismiss(),错误消失了。这并没有影响我的小部件的行为,但它令人不安,很可能已经标记了一个重要的内存泄漏。


11
2018-03-27 05:49



注意到我在finish()调用之前正在执行mDialog.hide()。将它更改为mDialog.dismiss()就可以了。 - mays