这个类是否泄漏了上下文对象?

Iha*_*imi 2 java android

曾经使用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,在那里我知道如何管理内存.垃圾收集语言让我感到不舒服,因为我不知道这种" 垃圾收集 "是如何发生的.

Ant*_*kov 7

是的,它是泄漏的Context,因为你的Context对象在你AsyncTask没有被终止之前不能被垃圾收集. doInBackground()方法可以进行一些大的操作,在终止之前你的Context生命仍然存在.将Context对象包装好的做法,WeakReference如果只能通过WeakReference's它访问该对象,则会被收集.