ProgressDialog:如何prevent泄露窗口 [英] ProgressDialog : how to prevent Leaked Window
问题描述
我用ProgressDialog至prevent距离,而该设备是从互联网上下载的东西进行交互的用户。
一切工作正常,直到我的客户成功地产生这种错误:
07-06 17:10:50.363:ERROR /窗口管理器(8821):活动android.pixelrain.framework.PixelRainActivity渗漏窗口com.android.internal.policy.impl。 PhoneWindow $ DecorView @ 463f3e50最初此处添加
07-06 17:10:50.363:ERROR /窗口管理器(8821):android.view.WindowLeaked:活动android.pixelrain.framework.PixelRainActivity渗漏窗口com.android.internal.policy.impl.PhoneWindow$DecorView@463f3e50这是原本在这里添加
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.view.ViewRoot< INIT>(ViewRoot.java:251)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.view.Window $ LocalWindowManager.addView(Window.java:424)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.app.Dialog.show(Dialog.java:241)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.app.ProgressDialog.show(ProgressDialog.java:107)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.app.ProgressDialog.show(ProgressDialog.java:90)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.pixelrain.HTTPHelper.DraftHelper.getDraft(DraftHelper.java:70)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.pixelrain.online.OnlineRetriver.getDraft(OnlineRetriver.java:312)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.pixelrain.HTTPHelper.DraftButtonGL.loadDraft(DraftButtonGL.java:72)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.pixelrain.HTTPHelper.DraftButtonGL.isTouched(DraftButtonGL.java:89)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.pixelrain.opengl.views.game.QuickStartGL.touchEnded(QuickStartGL.java:160)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.pixelrain.game.GameHandler.onTouchEvent(GameHandler.java:277)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.pixelrain.opengl.GLSurfaceViewChipmunk.onTouchEvent(GLSurfaceViewChipmunk.java:27)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.view.View.dispatchTouchEvent(View.java:3765)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1701)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.app.Activity.dispatchTouchEvent(Activity.java:2093)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1685)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.view.ViewRoot.handleMessage(ViewRoot.java:1802)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.os.Handler.dispatchMessage(Handler.java:99)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.os.Looper.loop(Looper.java:144)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在android.app.ActivityThread.main(ActivityThread.java:4937)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在java.lang.reflect.Method.invokeNative(本机方法)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在java.lang.reflect.Method.invoke(Method.java:521)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-06 17:10:50.363:ERROR /窗口管理器(8821):在dalvik.system.NativeStart.main(本机方法)
和我不知道如何解决这个问题。
任何想法是什么原因导致这个问题以及如何解决呢?
日志追溯错误这一行:
progressDialog = ProgressDialog.show(PixelRainActivity.staticThis,,PixelRainActivity.staticThis.getResources()的getString(R.string.draftProgressMessage),真的。);
将它解决的问题,如果我把它改成这样:
this.runOnUiThread(新的Runnable(){
公共无效的run(){
progressDialog = ProgressDialog.show(PixelRainActivity.staticThis,,PixelRainActivity.staticThis.getResources()的getString(R.string.draftProgressMessage),真。);
}
});
泄漏可能来自从 PixelRainActivity.staticThis
属性。如果你保持一个参考的活动,即使这项活动已经被破坏了,你有内存泄漏。
要解决的最简单的方法是使用应用程序的上下文
代替。改变你的 staticThis =的方法,该
行的onCreate()
到 staticThis = this.getApplicationContext ()
,它应该工作(并更改 staticThis
的类型上下文
如果这尚未的情况下)
I'm using ProgressDialog to prevent the user from interacting while the device is downloading stuff from internet.
everything was working fine until my client managed to produce this bug :
"07-06 17:10:50.363: ERROR/WindowManager(8821): Activity android.pixelrain.framework.PixelRainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@463f3e50 that was originally added here
07-06 17:10:50.363: ERROR/WindowManager(8821): android.view.WindowLeaked: Activity android.pixelrain.framework.PixelRainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@463f3e50 that was originally added here
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.view.ViewRoot.<init>(ViewRoot.java:251)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.view.Window$LocalWindowManager.addView(Window.java:424)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.app.Dialog.show(Dialog.java:241)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.app.ProgressDialog.show(ProgressDialog.java:107)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.app.ProgressDialog.show(ProgressDialog.java:90)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.pixelrain.HTTPHelper.DraftHelper.getDraft(DraftHelper.java:70)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.pixelrain.online.OnlineRetriver.getDraft(OnlineRetriver.java:312)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.pixelrain.HTTPHelper.DraftButtonGL.loadDraft(DraftButtonGL.java:72)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.pixelrain.HTTPHelper.DraftButtonGL.isTouched(DraftButtonGL.java:89)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.pixelrain.opengl.views.game.QuickStartGL.touchEnded(QuickStartGL.java:160)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.pixelrain.game.GameHandler.onTouchEvent(GameHandler.java:277)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.pixelrain.opengl.GLSurfaceViewChipmunk.onTouchEvent(GLSurfaceViewChipmunk.java:27)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.view.View.dispatchTouchEvent(View.java:3765)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:944)
07-06 17:10:50.363: ERROR/WindowManager(8821): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1701)
07-06 17:10:50.363: ERROR/WindowManager(8821): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.app.Activity.dispatchTouchEvent(Activity.java:2093)
07-06 17:10:50.363: ERROR/WindowManager(8821): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1685)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.view.ViewRoot.handleMessage(ViewRoot.java:1802)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.os.Handler.dispatchMessage(Handler.java:99)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.os.Looper.loop(Looper.java:144)
07-06 17:10:50.363: ERROR/WindowManager(8821): at android.app.ActivityThread.main(ActivityThread.java:4937)
07-06 17:10:50.363: ERROR/WindowManager(8821): at java.lang.reflect.Method.invokeNative(Native Method)
07-06 17:10:50.363: ERROR/WindowManager(8821): at java.lang.reflect.Method.invoke(Method.java:521)
07-06 17:10:50.363: ERROR/WindowManager(8821): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-06 17:10:50.363: ERROR/WindowManager(8821): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-06 17:10:50.363: ERROR/WindowManager(8821): at dalvik.system.NativeStart.main(Native Method)"
and I have no idea how to fix this.
any ideas what causes this and how to solve it ?
The log traces back the error to this line :
progressDialog = ProgressDialog.show(PixelRainActivity.staticThis, "",PixelRainActivity.staticThis.getResources().getString( R.string.draftProgressMessage), true);
would it solve the problem if I changed it to this :
this.runOnUiThread(new Runnable() {
public void run() {
progressDialog = ProgressDialog.show(PixelRainActivity.staticThis, "",PixelRainActivity.staticThis.getResources().getString( R.string.draftProgressMessage), true);
}
});
The leak comes probably from your PixelRainActivity.staticThis
attribute. If you’re keeping a reference to an activity, even after that this activity has been destroyed, you have a memory leak.
The easiest way to fix is to use the application’s Context
instead. Change your staticThis = this
line in the method onCreate()
to staticThis = this.getApplicationContext()
and it should work (and change the type of staticThis
to Context
if this is not already the case)
这篇关于ProgressDialog:如何prevent泄露窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!