【发布时间】:2017-03-22 00:54:49
【问题描述】:
我想创建一个简单的待办事项应用程序,将数据存储在共享首选项中。因此,我创建了一个名为 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);这是内存泄漏(也会破坏 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();
}
});
【问题讨论】:
-
我建议你不要把
adapter传给PrefManager,它更像是你保存数据和获取数据的工具。并且该工具可以从任何地方获取instanseofcontext。 -
您能解释一下吗?我只是在学习这个。 :)
-
你想去哪里
PrefManager?活动还是什么?如果可能的话,显示PrefManager。 -
已编辑。我添加了一些示例。
-
我认为你不应该这样使用
public static PrefManager mPrefManager;。因为这个静态对象将保存上下文(来自适配器)并且 GC 无法回收 Activity。
标签: java android memory memory-leaks