关于 android.view.WindowLeaked: 窗体泄露

一、问题

E/WindowManager: android.view.WindowLeaked: Activity com.jeany.demo.MainActivity has leaked window [email protected][] that was originally added here
        at android.view.ViewRootImpl.<init>(ViewRootImpl.java:485)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:346)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:92)
        at android.app.Dialog.show(Dialog.java:330)
        at com.jeany.base.ui.widget.SdkAlertDialog.show(SdkAlertDialog.java:26)
        at com.jeany.sdk.WYSdk.handleBackAction(WYSdk.java:105)
        at com.jeany.view.login.BaseLoginDialog$BackListener.onKey(BaseLoginDialog.java:125)
        at android.app.Dialog.dispatchKeyEvent(Dialog.java:776)
        at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:351)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4714)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4586)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4181)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4147)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4274)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4155)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4331)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4181)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4147)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4155)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4181)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4147)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4307)
        at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4468)
        at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2435)
        at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1998)
        at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1989)
        at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2412)
        at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:325)
        at android.os.Looper.loop(Looper.java:142)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

二、分析原因

  Android 的每一个 Activity 都有个 WindowManager 窗体管理器,

  同样,构建在某个 Activity 之上的对话框、PopupWindow 也有相应的 WindowManager 窗体管理器。

  因为对话框、PopupWindown 不能脱离 Activity 而单独存在着,

  所以当某个 Dialog (或 PopupWindow) 正在显示的时候去 finish() 了承载该 Dialog (或 PopupWindow )的 Activity 时,就会抛 Window Leaked 异常了,

  因为这个 Dialog (或 PopupWindow)的WindowManager已经没有谁可以附属了,所以它的窗体管理器已经泄漏了。

  android.view.WindowLeaked 一般会发生在 Activity 与 Dialog 的显示。

  Activity 中 create 一个 Dialog ,若先关闭 Dialog 再关闭 Activity 就是正常的,

  若先关闭 Activity 再关闭Dialog 就会报错这个android.view.WindowLeaked错误了。

  分析:Dialog 是基于 Activity 而创建的:new ProgressDialog(this);this 就是 Activity。

  Activtity 先 finish, 那 Dialog 就没得依附了,所以就会报 android.view.WindowLeaked。

三、解决方案

  关闭 (finish) 某个 Activity 前,要确保附属在上面的 Dialog 或 PopupWindow已经关闭 (dismiss) 了。

四、参考文档

  https://blog.csdn.net/xuan521521/article/details/51878403  

原文地址:https://www.cnblogs.com/pinweyshg/p/12005973.html

时间: 2024-10-13 00:19:31

关于 android.view.WindowLeaked: 窗体泄露的相关文章

关于android.view.WindowLeaked(窗体泄露)的解决方案

虽然是小问题一个,但也困扰了我一段时间,现在记下来,给自己做个备忘,也可以给其他人一个参考 Java代码   view plaincopy to clipboardprint? 01-08 01:49:27.874: ERROR/WindowManager(473): Activity com.photos.MainActivity has leaked window android.widget.ImageButton@43e40d10 that was originally added he

android.view.WindowLeaked的解决方法

Android.view.WindowLeaked一般会发生在Activity中Dialog的显示. android的dialog创建的时候会传入一个参数this,就是当前的activity,dialog必须在Activity销毁之前放掉,否则就会报windowleaked的错误. 分析这个原因是: Dialog是基于Activity而创建的:new ProgressDialog(this):this 就是Activity.Activtity先finish,那Dialog就没得依附了,所以就会报

关于android.view.WindowLeaked异常的解决方案

虽然是小问题一个,但也困扰了我一段时间,现在记下来,给自己做个备忘,也可以给其他人一个参考. Android.view.WindowLeaked按字面了解,Window Leaked大概就是说一个窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏呢? 产生原因: 我们知道Android的每一个Activity都有个WindowManager窗体管理器,同样,构建在某个Activity之上的对话框.PopupWindow也有相应的WindowManager窗体管理器.因为对话框.PopupWi

【Android】常见异常 —— android.view.WindowLeaked 分析以及解决办法

问题虽小,不过不知道还是比较麻烦的.异常信息: 10-22 10:19:38.651 12723-12723/cn.com.zte.uc E/WindowManager﹕ android.view.WindowLeaked: Activity cn.com.zte.uc.activites.shipTicket.OrderWrite1 has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{423fee70

android.view.WindowLeaked: Activity com.xty.activity.ActivityMainPage has leaked window com.android.

android.view.WindowLeaked: Activity com.xty.activity.ActivityMainPage has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{41331978 V.E..... R.....I. 0,0-480,226} that was originally added here 在通过dialog上的按钮跳转到另外一个activity时要关闭dial

android webview ZoomButtonsController 导致android.view.WindowLeaked 问题彻底解决

Activity has leaked window android.widget.ZoomButtonsController that was originally added here android.view.WindowLeaked: 引起这个错误的原因是: 发现是webview的 ZoomButton,也就是那两个放大和缩小的按钮,导致的.如果设置为让他们出现,并且可以自动隐藏,那么,由于他们的自动隐藏是一个渐变的过程,所以在逐渐消失的过程中如果调用了父容器的destroy方法,就会导

Android常见问题1:窗体泄露(1)

今天学习对话框AlertDialog,写一个Demo,需求是:只有一个Activitty,在这个Activity中只有一个按钮Button,当点击按钮Button时,弹出对话框,提示是否关闭该Activity,退出程序(只有一个界面). MainActivity源码: 1 package com.my.day22_my_dialog1; 2 3 import android.os.Bundle; 4 import android.view.KeyEvent; 5 import android.v

android.view.WindowLeaked的解决办法

来源: 按字面了解,Window Leaked大概就是说一个窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏呢? 产生原因: 我们知道Android的每一个Activity都有个WindowManager窗体管理器,同样,构建在某个Activity之上的对话框.PopupWindow也有相应的WindowManager窗体管理器.因为对话框.PopupWindown不能脱离Activity而单独存在着,所以当某个Dialog或者某个PopupWindow正在显示的时候我们去finish()

Android 窗体泄露问题

最近遇到这样一个问题: E/WindowManager(30314): android.view.WindowLeaked: Activity com.xxxxxx.www.activity.XXXActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{52b0f3ac V.E..... R......D 0,0-120,95} that was originally added here