2017-03-10 2 views
0

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

See video demo here:

Dies ist der Stacktrace des Lecks austritt:

enter image description here

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

Antwort

0

Ich kann nur spekulieren, aber ich nehme an, Sie gehen durch NavDrawerListAdapter selbst, vielleicht weil Sie Realm einige Listener geben, die einen Verweis auf Ihren Dialog/Aktivität hat und die Sie nicht löschen.

+0

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

+0

Hier ist der vollständige Code des Adapters: http://pastebin.com/XTwK8V9W – Muddz

Verwandte Themen