我理解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。