如何在静态上下文中使用带有上下文参数的 class 而不会导致内存泄漏?

How to use a class with a context argument in a static context without causing a memory leak?

在我的项目中我有这种情况。这是我的 MainActivity 的一部分,我用 applicationContext 初始化了对象 helperClass 并将其设为静态,因为我必须在按钮的 OnClickListener 中使用它:

public class MainActivity {
    public static HelperClass helperClass;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        helperClass = new HelperClass(getApplicationContext());

        {...}

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                helperClass.doSomething();
            }
        });
    }
}

这是助手 class 的一部分,我需要上下文,因为我必须在应用程序内存中存储一​​些数据:

public class HelperClass{
    private Context context;

    public HelperClass(Context context) {
        this.context = context;
    }

    public void doSomething() {
        File file = new File(context.getFilesDir(), "name");
        {...}
    }
}

现在,这段代码 有效 ,但是当我声明 helperClass static 时,有一条警告说这是内存泄漏;我试图从 HelperClass 中删除上下文,但无法从 class 中检索上下文;我还尝试删除静态声明,但我需要它,因为 OnClickListener 是静态上下文。

我读到 here 我可以使用 ApplicationContext,没关系,但这是一篇旧文章。

有没有更好的解决方案?

您无需将字段设置为静态即可在侦听器中使用它。此外,你不应该,因为你正确地说它可能会导致内存泄漏:-)只需删除 static 关键字,运行 代码,它就会工作 ^ ^

如果删除静态声明可以防止内存泄漏,您可以像这样从 onClick() 方法中删除静态声明和访问助手 class。

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MainActivity.this.helperClass.doSomething();
        }
    });

你可以去掉HelperClass的Context,通过方法doSomething( Context )发送context来避免你的问题。

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        helperClass.doSomething(v.getContext());
    }
});

因此以这种方式发送 Context,您不需要将其作为全局变量。

public class HelperClass{

    public HelperClass() {
    }

    public void doSomething(Context context) {
        File file = new File(context.getFilesDir(), "name");
        {...}
    }
}