Ich habe ein kleines Memorey-Leck mit leakCanary
in meiner App entdeckt, dass ich nicht beheben kann.Ich kann ein winziges Speicherleck, das mit CanaryLeak erkannt wurde, nicht beheben. [Video-Demo]
Das Leck wird erkannt, wenn ich meine NavigationDrawer
öffne und ein DialogView
einmal öffne und dann schließe es und öffne dann meine navdrawer wieder ein paar mal. EDIT: den Dialog öffnen und es einmal abgewiesen und verlassen nur die Schublade offen auch
Dies ist der Stacktrace des Lecks austritt:
NavDrawerFragment .class: in den fragmetns onDetach() Ich setze die Referenzen auf null, aber es hilft auch nicht
@OnClick(R.id.navDrawer_newList_btn)
public void onNewListBtnClick() {
addListDialog = new AddShoplistDialog();
addListDialog.show(getFragmentManager(), AddShoplistDialog.FRAGMENT_TAG);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
selectionListener = (NavDrawerContract.OnSelectionListener) activity;
}
@Override
public void onDetach() {
super.onDetach();
//These dont't solve the leak
selectionListener = null;
addListDialog = null;
recyclerAdapter = null;
}
NavDrawerListAdapter.class Dies ist die RecyclerViewAdapter
für die RecyclerView
im NavigationDrawer
public NavDrawerListAdapter(@NonNull Context context, @Nullable OrderedRealmCollection<Shoplist> data, NavDrawerContract.OnListItemActions selectionListener) {
super(context, data, true);
this.realm = Realm.getDefaultInstance();
this.selectionListener = selectionListener;
}
//Called when NavDrawerFragment's onDestroyView() is called
public void onCloseRealm() {
realm.close();
selectionListener = null;
}
ViewHolder im NavDrawerListAdapter.Class selectionListener
ist auch hier in den Adaptern verwendet ViewHolder
public class Viewholder extends RecyclerView.ViewHolder implements PopupMenu.OnMenuItemClickListener, View.OnClickListener {
public Viewholder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
selectionListener.onSelectedList(getItem(getAdapterPosition()).getId(), true);
selecetedPos = getAdapterPosition();
notifyDataSetChanged();
}
Realm wird nur im Adapterkonstruktor als 'new NavDrawerListInteractor (realm);' und im Adapter viewholder mit 'realm.executeTransaction (new Realm.Transaction()' Mein interactor und Realm haben keinen Listener dazu – Muddz
Hier ist der vollständige Code des Adapters: http://pastebin.com/XTwK8V9W – Muddz