在我的项目中我有这种情况。这是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
,这没关系,但它是一篇旧文章。
有更好的解决方案吗?
答案 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");
{...}
}
}