如何在静态上下文中使用带有上下文参数的 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");
{...}
}
}
在我的项目中我有这种情况。这是我的 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");
{...}
}
}