曾经使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
当然,Android Studio正在告诉我该context字段泄漏了一个Context对象.
我的问题是,
Context对象吗?要么,context = null;保证运行,因此不存在泄漏?这与警告不同:此AsyncTask类应该是静态的,否则可能会发生泄漏,因为在这种情况下,这不是类似的非静态内部类Context.
注意:我不是Java程序员,我不太了解垃圾收集.我主要使用c,在那里我知道如何管理内存.垃圾收集语言让我感到不舒服,因为我不知道这种" 垃圾收集 "是如何发生的.
是的,它是泄漏的Context,因为你的Context对象在你AsyncTask没有被终止之前不能被垃圾收集.
doInBackground()方法可以进行一些大的操作,在终止之前你的Context生命仍然存在.将Context对象包装好的做法,WeakReference如果只能通过WeakReference's它访问该对象,则会被收集.
| 归档时间: |
|
| 查看次数: |
642 次 |
| 最近记录: |