活动已泄露窗口 - 安卓

2022-09-01 18:16:46

请看以下代码段:

安卓系统上的自定义视图和窗口属性

问题

当我点击“主页按钮”时,被抛出:已泄漏窗口...从这行:exceptionActivity

localWindowManager.addView(colourView, layoutParams);

问题

你知道什么会导致它吗?

当我用后退按钮关闭应用程序时,没有发生问题。

异常/错误日志

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:

为什么这是一个问题?因为我所创建的只是扩展CordovaPlugin和小型辅助类的类。就这样。我无法(我想)修改活动类正文。我所能做的就是通过调用函数来获取对它的引用。cordova.getActivity()


答案 1

什么是编程中的泄漏?

您获取但未释放的内存会导致内存泄漏。类似的情况发生在(窗口/对话框)上。

这是怎么回事?

您正在尝试添加一个窗口,当它显示时,它位于前台,但是当您按下主页按钮时,它会暂停然后停止(尝试在onStop()和onPause()中放置一个祝酒词)。

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

溶液

在你的里面,并确保你关闭你的视图(如果它是一个对话框)或删除它(如果使用窗口管理器添加)。onStop() or onPause()onDestroy()dismiss()remove()

在卸载功能中添加消除或删除功能,因为您提到在按下后退按钮时会出现此错误。退出应用时,将调用其方法。onUnload()

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

正如我所观察到的,您正在尝试制作一个系统警报窗口,该窗口位于其下方的任何内容上。在活动中添加此类弹出窗口是有风险的,因为它可能会导致泄漏问题。您实际上可以通过 添加此类窗口,以便它比您的活动更持久,并显示在设备上的任何地方(如果这是您需要的)。Service

看看这个

更新 2 - 科尔多瓦生命周期

你为什么不尝试在你的CordovaPlugin类中覆盖onUnload方法。我试图找到,但文档提到了onPause和onResume方法的存在。如果您在 CordovaPlugin 类中启用了Unload,请删除您在视图类 runOnUiThread 方法中创建的视图。


答案 2

您正在尝试在退出活动后显示。Dialog

解决方案是在退出之前调用您创建的 ,例如在 onPause() 中)。在离开 .dismiss()DialogActivityActivity

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

希望它对你有所帮助。

活动已泄漏窗口最初添加


推荐