Android Window泄漏期间内部会发生什么?

时间:2016-06-29 21:12:56

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

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

如何将此概念映射到Android中的WindowLeaked例外?

例如,以下代码会导致WindowLeaked异常 在AsyncTask执行期间更改方向。在这种情况下,什么 对象仍然引用不需要的对象? ProgressDialogActivity

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 "";
        }
    }
}

2 个答案:

答案 0 :(得分:0)

WindowLeaked 是由ProgressDialog引起的,因为在Android中更改旋转会导致活动破坏并再次加载。

因此,您需要在活动被销毁之前致电mProgress.dismiss()

答案 1 :(得分:0)

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

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