[英]How can I solve this memory leak? Actually, where is the memory leak?
我想创建一个易于执行的应用程序,以共享的首选项存储数据。 因此,我创建了一个名为PrefManager的类,该类包含了连接管理首选项中的所有方法。 在这种情况下,方法“ getSharedPreferences”需要上下文。 可以,但是我必须在其他所有类中都使用该类,包括recyclerView适配器类。
所以我提出了这个“解决方案”(ToDoActivity):
public static PrefManager mPrefManager;
private RecyclerView mRecyclerView;
private ToDoRecyclerViewAdapter adapter;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_to_do);
context = getApplicationContext();
adapter = new ToDoRecyclerViewAdapter(this);
mPrefManager = new PrefManager(context, adapter);
mPrefManager.setupThePreferences();
...
并随处可见:
import static bla.bla.bla.ToDoActivity.mPrefManager;
但是我得到这个错误:
不要将Android上下文类放在静态字段中(对PrefManager的静态引用,该字段的上下文指向Context); 这是内存泄漏(并且还会中断即时运行)。 静态字段将泄漏上下文。
我怎样才能做得更好? 我该如何解决?
编辑
我在RecycleView适配器中通过删除以下项目来使用它:
public class ToDoRecyclerViewAdapter extends RecyclerView.Adapter <ToDoRecyclerViewAdapter.ViewHolder>
那里:
holder.mView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int identifier = holder.myTodo.getIdentifier();
removeTodo(position);
mPrefManager.deleteThePref(identifier);
return false;
}
});
或在我的Todo创建活动中:
public class CreateActivity extends Activity
那里:
btnCreateExit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPrefManager.saveNewToDo(editTodoTitle.getText().toString(), spinnerTodoPriority.getSelectedItemPosition(), editTodoDescription.getText().toString(), date);
finish();
}
});
在TodoActivity
,声明PrefManager并为其生成getter
。
private PrefManager mPrefManager; public PrefManager getmPrefManager{ return mPrefManager; }
在Adapter
,当您删除项目时:
removeTodo(position); ((TodoActivity)context).getmPreManager().deleteThePref(identifier);
重新创建PrefManager
构造函数,并仅传递context
:
public PrefManager(Context context){ super(); context.getSharedPreferences(...); }
在CreateActivity
,新建一个PrefManager
:
mPrefManager = new PrefManager(context); mPrefManager.setupThePreferences();
尝试扩展活动以访问ToDoActivity。
例如:
public class AnotherActivity extends ToDoActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_to_do);
context = getApplicationContext();
adapter = new ToDoRecyclerViewAdapter(this);
mPrefManager = new PrefManager(context, adapter);
mPrefManager.setupThePreferences();
...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.