我怎样才能解决这个内存泄漏问题?实际上,内存泄漏在哪里?

时间:2017-03-22 00:54:49

标签: java android memory memory-leaks

我想创建一个简单的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();
    }
});

2 个答案:

答案 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();
...
    }
}