tom*_*ski 25 java android android-activity cordova
看看这些代码:
问题
当我点击"主页按钮"时,exception抛出:Activity泄漏了窗口......从这一行:
localWindowManager.addView(colourView, layoutParams);
Run Code Online (Sandbox Code Playgroud)
问题(S)
你知道是什么原因引起的吗?
当我用后退按钮关闭应用程序时,问题不会发生.
异常/错误日志
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
Run Code Online (Sandbox Code Playgroud)
编辑:
如何在Cordova Activity中向onPause(),onStop()等函数添加内容?
编辑2:
为什么这是一个问题?因为我创建的所有类都扩展了CordovaPlugin和小型辅助类.就这样.我无法(我想)修改Activity类体.我所能做的只是通过调用cordova.getActivity()函数来引用它.
caf*_*991 47
编程有什么漏洞?
您获取但未释放的内存会导致内存泄漏.(窗口/对话框)也会发生类似情况.
这里发生了什么事?
您正在尝试添加一个窗口,当它显示时它位于前台,但是当您按下主页按钮时它会暂停然后停止(尝试在onStop()和onPause()中放一个toast.
由于您没有告诉系统删除您的视图,因此它仍然附加到现在已从应用程序中消失/分离的窗口.因此,根据系统,您的customView占用了它未释放的空间.
解
在你的内部onStop() or onPause()并onDestroy()确保你关闭你的视图(dismiss()如果它是一个对话框)或删除它(remove()如果使用窗口管理器添加).
在你的卸载函数中添加dismiss或remove函数,因为你提到按下后退按钮就会出现这个错误.退出应用程序时onUnload()会调用它的方法.
建议(如果没有上下文,请忽略)
正如我可以观察到的那样,你正试图建立一个系统警报窗口,它会覆盖它下面的任何东西.在活动中添加这种弹出窗口是有风险的,因为它可能会导致泄漏问题.实际上,您可以通过一个窗口添加这样的窗口Service,使其比您的活动更长,并显示在设备上的任何位置(如果这是您需要的).
更新2-Cordova生命周期
为什么不尝试覆盖CordovaPlugin类中的onUnload方法.我尝试查找,但是文档提到了onPause和onResume方法的存在.如果你在CordovaPlugin类中获得onUnload,那么删除你在视图类中创建的视图runOnUiThread方法.
Jeb*_*han 11
您在Dialog退出活动后尝试显示.
解决的办法是打电话给dismiss()在Dialog退出之前创建Activity,例如在onPause().在离开之前,应关闭所有窗口和对话框Activity.
@Override
protected void onStop() {
super.onStop();
if (loadingDlg != null) {
loadingDlg.dismiss();
loadingDlg = null;
}
}
Run Code Online (Sandbox Code Playgroud)
希望它对你有所帮助.
| 归档时间: |
|
| 查看次数: |
36867 次 |
| 最近记录: |