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

来源:互联网 发布:中国电信网络套餐 编辑:程序博客网 时间:2024/06/03 05:42

在程序起始的时候,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 hereE/WindowManager(  244): android.view.WindowLeaked: Activity MyAct has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@433b7150 that was originally added hereE/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


原创粉丝点击