Android:旋转屏幕和打开对话框时窗口泄漏

Android:旋转屏幕和打开对话框时窗口泄漏,android,dialog,Android,Dialog,当您单击“我的活动”中的图像时,会弹出一个对话框。当对话框打开且用户旋转屏幕时,我的LogCat中将显示以下内容: 08-23 09:47:47.151: E/WindowManager(15589): Activity my.activity.MyActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43554748 that was originally added here 08-

当您单击“我的活动”中的图像时,会弹出一个对话框。当对话框打开且用户旋转屏幕时,我的LogCat中将显示以下内容:

08-23 09:47:47.151: E/WindowManager(15589): Activity my.activity.MyActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43554748 that was originally added here
08-23 09:47:47.151: E/WindowManager(15589): android.view.WindowLeaked: Activity my.activity.MyActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43554748 that was originally added here
08-23 09:47:47.151: E/WindowManager(15589):     at android.view.ViewRoot.<init>(ViewRoot.java:247)
08-23 09:47:47.151: E/WindowManager(15589):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
08-23 09:47:47.151: E/WindowManager(15589):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
08-23 09:47:47.151: E/WindowManager(15589):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
08-23 09:47:47.151: E/WindowManager(15589):     at android.app.Dialog.show(Dialog.java:241)
08-23 09:47:47.151: E/WindowManager(15589):     at tip.machine.MyActivity$8.onClick(MyActivity.java:385)
08-23 09:47:47.151: E/WindowManager(15589):     at android.view.View.performClick(View.java:2408)
08-23 09:47:47.151: E/WindowManager(15589):     at android.view.View$PerformClick.run(View.java:8816)
08-23 09:47:47.151: E/WindowManager(15589):     at android.os.Handler.handleCallback(Handler.java:587)
08-23 09:47:47.151: E/WindowManager(15589):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-23 09:47:47.151: E/WindowManager(15589):     at android.os.Looper.loop(Looper.java:123)
08-23 09:47:47.151: E/WindowManager(15589):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-23 09:47:47.151: E/WindowManager(15589):     at java.lang.reflect.Method.invokeNative(Native Method)
08-23 09:47:47.151: E/WindowManager(15589):     at java.lang.reflect.Method.invoke(Method.java:521)
08-23 09:47:47.151: E/WindowManager(15589):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
08-23 09:47:47.151: E/WindowManager(15589):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-23 09:47:47.151: E/WindowManager(15589):     at dalvik.system.NativeStart.main(Native Method)
我认为,如果未实例化
对话框
,catch块将捕获错误。无论如何,每次旋转时,无论对话框是否打开,我都只输入catch块。当对话框打开并旋转时,我得到与上面相同的堆栈跟踪(它直接进入catch块)。因此,它似乎从未尝试使用
对话框。dismise()
,这就是为什么我仍然收到
窗口泄漏的消息


有什么想法吗?我的变量声明/实例化一定有问题。谢谢。

没关系,我知道了。问题是,我有两个图像,它们都使用相同的对话框变量(在触摸时实例化它并启动它们自己的对话框)。因此,第二个图像引用了对话框,再次将其声明为
final dialog dialog…
。在我创建
对话框
全局变量之前,我就是这样做的

删除重新声明后,一切都很完美


另外,对于只能在不同时间启动的两个不同对话框,使用相同的对话框变量是否存在任何风险?

如果您在屏幕上更改横向为纵向或纵向为横向,则此原因在重新绘制视图之前,您必须关闭对话框

所以,
尝试将此属性
android:configChanges=“orientation”
添加到AndroidManifest.xml文件中的活动元素。

我同意您的变量声明/实例化一定有问题。“你能把密码发出去吗?”塞缪尔收到了,谢谢。如果您感兴趣,请参阅我的答案。只要您每次使用它们时都创建一个新实例……不。但是,如果您只是为了在交互后进行任何后台处理而隐藏它们,或者希望保存它们的状态,则可能会导致问题。
@Override
protected void onPause() {
    System.out.println("IN PAUSE!");
    try {
        dialog.dismiss();
        System.out.println("IN TRY!");
    }
    catch   (java.lang.NullPointerException exception)  {System.out.println("IN CATCH!");}
    super.onPause();
}