任何使用Android Studio的人都知道它有一个非常有用的代码linting容量,可以帮助程序员避免常见的反模式和错误。
然而,这样的系统有时很烦人,在这种特殊情况下,我认为它就是这样。
我有AsyncTask
喜欢以下
class MyAsyncTask extends AsyncTask<Void, Void, MyDataType> {
private Context context;
MyAsyncTask(Context _context) {
context = _context;
}
@Override
protected void onPreExecute() {
// Show a progress dialog or something
// to indicate that we're doing some work
// here.
}
@Override
protected MyDataType doInBackground(Void... args) {
return generateData(); // returns `MyDataType` of course
}
@Override
protected void onPostExecute(MyDataType data) {
// Deliver the data and then
context = null;
}
}
当然,Android Studio正在告诉我context
字段泄漏了Context
个对象。
我的问题是,
Context
对象吗?或者,context = null;
保证运行,因此没有泄漏?这与Warning: This AsyncTask class should be static or leaks might occur不同,因为在这种情况下,这不是Context
的非静态内部类。
注意:我不是Java程序员,我不太了解垃圾收集。我主要使用c,在那里我知道如何管理内存。垃圾收集语言让我感到不舒服,因为我不知道这个“垃圾收集”是如何发生的。
答案 0 :(得分:7)
是的,它是Context
的泄漏,因为在Context
未终止之前,您的AsyncTask
对象无法进行垃圾回收。
doInBackground()
方法可以进行一些大型操作,在终止之前Context
仍然有效。
将Context
对象包装到WeakReference
的好习惯,如果只能通过WeakReference's
访问此对象,则会收集它。