繁体   English   中英

我该如何解决此内存泄漏? 实际上,内存泄漏在哪里?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM