在Android窗口泄漏期间内部发生了什么



我理解Java中内存泄漏的基本概念(即,一些不需要的对象仍然被其他人引用并且不能被GCed(。

如何将此概念映射到 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 "";
        }
    }
}

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

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

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

您可以使用遵循活动生命周期的 AsyncTaskLoader。

相关内容

  • 没有找到相关文章

最新更新