我理解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 "";
}
}
}
答案 0 :(得分:0)
WindowLeaked 是由ProgressDialog
引起的,因为在Android中更改旋转会导致活动破坏并再次加载。
因此,您需要在活动被销毁之前致电mProgress.dismiss()
。
答案 1 :(得分:0)
您没有显示您使用的上下文类型(活动或应用程序)。 主要问题甚至不是进度条而是上下文。任何静态类都可以比Activity调用者更长,如果静态类保存上下文,它会阻止在配置更改期间收集该上下文的所有者。
您可以使用尊重Activity生命周期的AsyncTaskLoader。