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

时间:2018-01-15 14:40:07

标签: 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;
    }            
}

当然,Android Studio正在告诉我context字段泄漏了Context个对象。

我的问题是,

  • 这真的泄漏了Context对象吗?或者,
  • 是否context = null;保证运行,因此没有泄漏?

这与Warning: This AsyncTask class should be static or leaks might occur不同,因为在这种情况下,这不是Context非静态内部类

注意:我不是Java程序员,我不太了解垃圾收集。我主要使用c,在那里我知道如何管理内存。垃圾收集语言让我感到不舒服,因为我不知道这个“垃圾收集”是如何发生的。

1 个答案:

答案 0 :(得分:7)

是的,它是Context的泄漏,因为在Context未终止之前,您的AsyncTask对象无法进行垃圾回收。 doInBackground()方法可以进行一些大型操作,在终止之前Context仍然有效。 将Context对象包装到WeakReference的好习惯,如果只能通过WeakReference's访问此对象,则会收集它。