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

时间:2016-09-30 13:25:34

标签: java android memory-leaks android-context

在我的项目中我有这种情况。这是MainActivity的一部分,我已使用helperClass初始化了对象applicationContext并将其设置为静态,因为我必须在按钮的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();
            }
        });
    }
}

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

public class HelperClass{
    private Context context;

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

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

现在,此代码正常工作,但当我声明helperClass静态时,会发出警告,说这是内存泄漏;我试图从HelperClass中删除上下文,但我无法从类中检索上下文;我也尝试删除静态声明,但我需要它,因为OnClickListener是静态上下文。

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

有更好的解决方案吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

如果删除静态声明阻止了内存泄漏,则可以从onClick()方法中删除静态声明和访问助手类。

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

答案 2 :(得分:0)

您可以删除HelperClass的Context并通过方法 doSomething(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");
        {...}
    }
}