活动泄露了窗口 – Android

看看这些代码:

Android上的自定义视图和窗口属性

问题

当我点击“主页button”,引发exception: Activity已经泄漏窗口…从这一行:

 localWindowManager.addView(colourView, layoutParams); 

问题(S)

你知道是什么原因造成的吗?

当我用后退buttonclosures应用程序时,问题不会发生。

exception/错误日志

 W/InputManagerService( 96): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@40908148 (uid=10056 pid=1368) D/CordovaActivity( 1368): CordovaActivity.onDestroy() D/CordovaWebView( 1368): >>> loadUrlNow() E/WindowManager( 1368): Activity com.phonegap.helloworld.HelloWorld has leaked window pl.edu.uj.tcs.student.xxx.Display$Layer@40589368 that was originally added here E/WindowManager( 1368): android.view.WindowLeaked: Activity com.phonegap.helloworld.HelloWorld has leaked window pl.edu.uj.tcs.student.xxx.Display$Layer@40589368 that was originally added here E/WindowManager( 1368): at android.view.ViewRoot.<init>(ViewRoot.java:258) E/WindowManager( 1368): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) E/WindowManager( 1368): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) E/WindowManager( 1368): at android.view.Window$LocalWindowManager.addView(Window.java:424) E/WindowManager( 1368): at pl.edu.uj.tcs.student.xxx.Display.setColorsViews(Display.java:181) E/WindowManager( 1368): at pl.edu.uj.tcs.student.xxx.Display$3.run(Display.java:139) E/WindowManager( 1368): at android.os.Handler.handleCallback(Handler.java:587) E/WindowManager( 1368): at android.os.Handler.dispatchMessage(Handler.java:92) E/WindowManager( 1368): at android.os.Looper.loop(Looper.java:130) E/WindowManager( 1368): at android.app.ActivityThread.main(ActivityThread.java:3683) E/WindowManager( 1368): at java.lang.reflect.Method.invokeNative(NativeMethod) E/WindowManager( 1368): at java.lang.reflect.Method.invoke(Method.java:507) E/WindowManager( 1368): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) E/WindowManager( 1368): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) E/WindowManager( 1368): at dalvik.system.NativeStart.main(Native Method) D/CordovaActivity( 1368): onMessage(onPageStarted,about:blank) D/CordovaWebViewClient( 1368): onPageFinished(about:blank) D/CordovaActivity( 1368): onMessage(onPageFinished,about:blank) D/CordovaActivity( 1368): onMessage(exit,null) I/power ( 96): *** set_screen_state 0 

编辑:

我怎样才能在Cordova Activity的onPause(),onStop()等函数中添加一些东西?

编辑2:

为什么这是一个问题? 因为我创build的所有类都扩展了CordovaPlugin和小型辅助类。 就这样。 我不能(我想)修改活动课主体。 我所能做的就是通过调用cordova.getActivity()函数来获得对它的引用。

Solutions Collecting From Web of "活动泄露了窗口 – Android"

什么是编程漏洞?

你获得的内存,不释放导致内存泄漏。类似的(Windows /对话框)发生。

这里发生了什么事?

你正在尝试添加一个窗口,当它显示它在前台,但是当你按下主页button时,它会被暂停,然后停止(尝试在onStop()和onPause())中添加一个Toast。

由于您没有告诉系统删除​​您的视图,因此它仍然附着到现在已经从应用程序中消失/分离的窗口。 因此,根据系统你的customView占据了它没有释放的空间。

在你的onStop() or onPause()onDestroy()确保你closures了你的视图(如果是对话框则dismiss() )或者删除它(如果使用窗口pipe理器添加,则remove() )。

在你的卸载函数中添加dismiss或remove函数,就像你刚才提到的那样,在按下button时你会得到这个错误。在退出应用程序的时候,它的onUnload()方法被调用。

build议(如果不在上下文中,则忽略)

正如我可以观察到的,你正在试图build立一个系统警报窗口来覆盖它下面的任何东西。在活动中添加这样的popup窗口是有风险的,因为它可能会导致泄漏问题。 你可能实际上通过一个Service添加这样的窗口,所以它超出你的活动,并出现在设备上的任何地方(如果这是你所需要的)。

看一下这个

更新2 – cordova生命周期

你为什么不尝试重写你的CordovaPlugin类中的onUnload方法。我试图find,但是文档提到了onPause和onResume方法的存在。如果你在CordovaPlugin类的onUnload中,然后删除你在视图类中的视图runOnUiThread方法。

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

解决scheme是在退出Activity之前创build的Dialog调用dismiss() ,例如在onPause()中。 所有窗口和对话框应该在离开Activity之前closures。

 @Override protected void onStop() { super.onStop(); if (loadingDlg != null) { loadingDlg.dismiss(); loadingDlg = null; } } 

希望它应该对你有帮助。

-这-是-原先添加活动,已-泄露窗口

检查对话框显示与否的天气

 @Override protected void onStop() { super.onStop(); if (loadingDlg != null) { if(loadingDlg.isShowing()) loadingDlg.dismiss(); loadingDlg = null; } } 

当您的上下文显示对话框时,通常会发生泄漏窗口,并且上下文突然被迫closures,您的对话框没有被正确解除。

为了解决这个问题,你必须在窗口泄露错误之前修正你的错误。

我调用了AlertDialog之前被调用的完成(),导致Activity在调用AlertDialog之前完成。 我删除了finish()并把它放在用户使用AlertDialog完成input之后,并且修正了窗口泄漏。