在屏幕旋转后,ProgreeDialog出现leaked window com.android.internal的错误

在程序起始的时候,acticity启动一个线程去请求部分数据,这时在ui层,弹出一个进度条,正常情况下没有什么问题,但是当在线程没有运行结束,ProgressDialog还在show的时候,在log中会出现错误如下:

E/WindowManager(  244): Activity MyAct has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@433b7150 that was originally added here
E/WindowManager(  244): android.view.WindowLeaked: Activity MyAct has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@433b7150 that was originally added here
E/WindowManager(  244):     at android.view.ViewRoot.<init>(ViewRoot.java:178)
E/WindowManager(  244):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:147)
E/WindowManager(  244):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:90)
E/WindowManager(  244):     at android.view.Window$LocalWindowManager.addView(Window.java:393)
E/WindowManager(  244):     at android.app.Dialog.show(Dialog.java:212)
E/WindowManager(  244):     at android.app.ProgressDialog.show(ProgressDialog.java:103)
E/WindowManager(  244):     at android.app.ProgressDialog.show(ProgressDialog.java:91)
E/WindowManager(  244):     at MyAct.send(MyAct.java:294)
E/WindowManager(  244):     at MyAct$4.onClick(MyAct.java:174)
E/WindowManager(  244):     at android.view.View.performClick(View.java:2129)
E/WindowManager(  244):     at android.view.View.onTouchEvent(View.java:3543)
E/WindowManager(  244):     at android.widget.TextView.onTouchEvent(TextView.java:4664)
E/WindowManager(  244):     at android.view.View.dispatchTouchEvent(View.java:3198)
E/WindowManager(  244):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:857)
E/WindowManager(  244):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:857)
E/WindowManager(  244):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:857)
E/WindowManager(  244):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:857)
E/WindowManager(  244):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:857)
E/WindowManager(  244):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1593)
E/WindowManager(  244):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1089)
E/WindowManager(  244):     at android.app.Activity.dispatchTouchEvent(Activity.java:1871)
E/WindowManager(  244):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1577)
E/WindowManager(  244):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1140)
E/WindowManager(  244):     at android.os.Handler.dispatchMessage(Handler.java:88)
E/WindowManager(  244):     at android.os.Looper.loop(Looper.java:123)
E/WindowManager(  244):     at android.app.ActivityThread.main(ActivityThread.java:3739)
E/WindowManager(  244):     at java.lang.reflect.Method.invokeNative(Native Method)
E/WindowManager(  244):     at java.lang.reflect.Method.invoke(Method.java:515)
E/WindowManager(  244):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
E/WindowManager(  244):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:497)
E/WindowManager(  244):     at dalvik.system.NativeStart.main(Native Method)

我做了一个简单的代码如下:

public class MyAct extends Activity implements Runnable {
    public ProgressDialog mProgress;

    // UI has a button that when pressed calls send

    public void send() {
         mProgress = ProgressDialog.show(this, "Please wait", 
                      "Please wait", 
                      true, true);
        Thread thread = new Thread(this);
        thread.start();
    }

    public void run() {
        Thread.sleep(10000);
        Message msg = new Message();
        mHandler.sendMessage(msg);
    }

    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            mProgress.dismiss();
        }
    };
}

问题解决了。

主要是由于在屏幕旋转的时候,view发生改变,而另一个进程还在尝试改变老的视图,去掉diaolog.

我用两个方式,都比较简单:
1.是在配置文件中忽略横竖屏旋转。

android:configChanges="orientation|keyboardHidden"

2.是在OnPause的时候对progressDialog进行处理:

protected void onPause() {
        super.onPause();
        if ((mProgress != null) && mProgress.isShowing()) {
            mProgress.dismiss();
        }
    }

原文地址: http://www.dewen.org/q/3334/%E5%9C%A8%E5%B1%8F%E5%B9%95%E6%97%8B%E8%BD%AC%E5%90%8E%EF%BC%8CProgreeDialog%E5%87%BA%E7%8E%B0leaked+window+com.android.internal%E7%9A%84%E9%94%99%E8%AF%AF


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
android.leaked window.decorview@f475e85[portraitadactivity]” 错误Android 应用程序开发中一个常见的错误,它通常是由于窗口泄漏引起的。当一个 Activity 被销毁并且窗口仍然存在于内存中时,就会出现这个错误。 通常,当你在一个 Activity 中创建了一个 Dialog、PopupWindow 或者其他一些覆盖在Activity上的窗口时,如果没有及时释放这些窗口,就会导致窗口泄漏。这种泄漏会阻止系统回收这些未使用的资源,因此会引发内存泄漏问题。 要解决这个错误,可以采取以下几个步骤: 1. 确保在 Activity 销毁之前及时关闭或释放所有的 Dialog、PopupWindow 等窗口资源。 2. 在 Activity 的 onDestroy() 方法中调用 dismiss() 或者 cancel() 方法来关闭窗口。 3. 检查是否在其他地方也存在窗口泄漏的情况,并进行相应的修复。 4. 如果确定窗口泄漏是由于长时间运行的任务或线程导致的,可以考虑使用弱引用来持有窗口,以便在 Activity 销毁时能够自动释放这些资源。 5. 使用内存分析工具,如Android Studio 的内存分析器,来识别是否存在窗口泄漏问题,并进行调试和修复。 总结来说,android.leaked window.decorview@f475e85[portraitadactivity] 错误是由于窗口泄漏导致的,通过及时释放窗口资源和修复泄漏问题,可以解决此错误。定义良好的生命周期管理和使用内存分析工具是有效诊断和解决该错误的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值