簡體   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