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