【问题标题】:What happens internally during an Android Window Leak?Android Window Leak 期间内部会发生什么?
【发布时间】:2016-06-29 21:12:56
【问题描述】:

我了解 Java 中内存泄漏的基本概念(即一些不需要的对象仍然被其他人引用,无法被 GC)。

如何将此概念映射到 Android 中的 WindowLeaked 异常?

例如,以下代码会在以下情况下引发WindowLeaked 异常 在AsyncTask 执行期间更改方向。在这种情况下,什么 对象仍然持有不需要的引用? ProgressDialog 还是 Activity

public class WindowLeakedTestActivity extends AppCompatActivity {
    ...
    static class MyTask extends AsyncTask<Void, Void, String> {
        Context context;
        private ProgressDialog mProgress;

        public MyTask(Context c) {
            context = c;
        }

        protected void onPreExecute() {
            super.onPreExecute();
            mProgress = ProgressDialog.show(context, "hello world", "wait", true, true);
        }

        protected String doInBackground(Void... params) {
            try {
                Thread.sleep(8000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "";
        }
    }
}

【问题讨论】:

    标签: android memory-leaks android-asynctask android-windowmanager


    【解决方案1】:

    WindowLeaked 是由ProgressDialog 引起的,因为在 android 中更改旋转会导致 Activity 销毁并再次加载。

    因此,您需要在您的活动被销毁之前调用mProgress.dismiss()

    【讨论】:

    • 感谢您的回答!但是为什么progressdialog 被销毁时progressdialog 会泄露?
    • 良好的链接。但它没有回答谁持有对 progressdialog 的引用,因此它不能被 GCed。
    • WindowLeak 不翻译为内存泄漏...命名方案听起来有误导性。这只是来自框架的通知,显示 Dialog 的窗口已泄漏,因为保存该窗口的 Activity 已被破坏......
    【解决方案2】:

    您没有显示您使用的上下文类型(活动或应用程序)。 主要问题甚至不是进度条而是上下文。任何静态类都可以比 Activity 调用者活得更久,如果静态类持有上下文,它会阻止该上下文的所有者在配置更改期间获得。

    您可以使用尊重 Activity 生命周期的 AsyncTaskLoader。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多