我想创建一个简单的todo appliacation,它将数据存储在共享首选项中。因此,我创建了一个名为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上下文类放在静态字段中(对具有指向Context的字段上下文的PrefManager的静态引用);这是一个内存泄漏(也打破了Instant Run)。静态字段会泄漏上下文。
我怎样才能让它变得更好?我该如何解决这个问题?
修改
我通过删除项目在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();
}
});
答案 0 :(得分:0)
在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();
答案 1 :(得分:-4)
尝试扩展您的活动以访问您的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();
...
}
}