报错:WindowManager: android.view.WindowLeaked: Activity has leaked window so was originaly added here

首先贴上具体的全部报错信息:

E/WindowManager: android.view.WindowLeaked: Activity com.liangzi.demo.sdkdemo.MainActivity has leaked window com.quantum.sdk.AVCallFloatView{4337e6c0 V.E..... ......I. 0,0-120,120} that was originally added here
                                                      at android.view.ViewRootImpl.(ViewRootImpl.java:381)
                                                      at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:258)
                                                      at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)

 //这一行崩掉的就是windowmanager.add(view,params);                                                  ***at com.quantum.sdk.Util.FloatWindowUtil.show(FloatWindowUtil.java:81)***
                                                      ***at com.quantum.sdk.fragment.LoginViewFragment.loginCallback(LoginViewFragment.java:435)***
                                                      ***at com.quantum.sdk.fragment.LoginViewFragment.httpCallback(LoginViewFragment.java:348)***
                                                      ***at com.quantum.sdk.fragment.QTBaseFragment$1.httpCallback(QTBaseFragment.java:72)***
                                                      ***at com.quantum.sdk.Util.QTHttpHandler$1.run(QTHttpHandler.java:88)***
                                                      at android.os.Handler.handleCallback(Handler.java:733)
                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                      at android.os.Looper.loop(Looper.java:136)
                                                      at android.app.ActivityThread.main(ActivityThread.java:5314)
                                                      at java.lang.reflect.Method.invokeNative(Native Method)
                                                      at java.lang.reflect.Method.invoke(Method.java:515)
                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:680)
                                                      at dalvik.system.NativeStart.main(Native Method)

以上这个窗口泄漏问题,已经足足的困扰了我2个星期,百度了很多次,发现网上都是说的是当前windowManager所依赖的activity关闭后,其依赖的dialog或者popWindow还在展示中,没有关闭,才造成了窗口(windowLeaked)的泄漏.这只是其中的一种情况.
我的是属于第二种情况:在主线程中,布局动态加载,销毁的时候导致windowmanager通过AddView()方法添加的View没有依存,导致窗体泄露.
重点:解决方法
windowManager.removeViewImmediate( View view);——->removeViewImmediate()是通知View立刻调用View.onDetachWindow()

以下是转载的一位大神的解答:

Android.view.WindowLeaked按字面了解,Window Leaked大概就是说一个窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏呢?

产生原因:
1.我们知道Android的每一个Activity都有个WindowManager窗体管理器,同样,构建在某个Activity之上的对话框、PopupWindow也有相应的WindowManager窗体管理器。因为对话框、PopupWindown不能脱离Activity而单独存在着,所以当某个Dialog或者某个PopupWindow正在显示的时候我们去finish()了承载该Dialog(或PopupWindow)的Activity时,就会抛Window Leaked异常了,因为这个Dialog(或PopupWindow)的WindowManager已经没有谁可以附属了,所以它的窗体管理器已经泄漏了。

2.还有一种情况就是下面代码,来创建窗口渲染的时候(本人遇到这种情况)

我们在做UI相关的代码时有时候会碰到WindowLeak,也就是所谓的窗体泄露,泄露的原因是因为androidUI操作在主线程中操作,但是我们会需要在一些线程或者异步任务中操作UI界面元素的需求,那么这个时候可能会出现类似问题。我在做浮动窗口的时候碰到了这个问题,浮动窗口需要用到WindowManager,windowManger又是一个activity的一个变量,它依存于Activity,当横竖屏切换或者activity销毁的时候这个变量会销毁。销毁的时候导致windowmanager通过AddView()方法添加的View没有依存,导致窗体泄露。那么问题来了,为什么这里会泄露了?

解决方法:
1.关闭(finish)某个Activity前,要确保附属在上面的DialogPopupWindow已经关闭(dismiss)了。

2.解决方法:在onDestroy()里面调用了removeView方法,想要避免窗体泄露,但是这个方法并不管用,后来换成removeViewImmediate()就解决了这个问题,原因就是两个方法设计到线程同步问题,removeViewImmediate()是通知View立刻调用View.onDetachWindow(),这说明这个方法是通过一个监听或者观察者来实现的,因为线程的同步跟异步问题导致activity销毁了,但view还没有被remove完,于是就产生了所谓的窗体泄露。说到这里,我想大家也能明白这两个方法的区别了。

最后附上作者:原来链接的地址
http://blog.csdn.net/sharp36/article/details/53611619

你可能感兴趣的:(报错)