ProgressDialog:如何prevent泄露窗口 [英] ProgressDialog : how to prevent Leaked Window

查看:99
本文介绍了ProgressDialog:如何prevent泄露窗口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆