java - RecyclerView leaks in FragmentPagerAdapter -


i've figured out in defined concatenation of circumstances recyclerview leads memory leak. archive such effect, have created fragmentpageradapter contains fragment recyclerview child. in case of going application background or finishing, leak canary fires memory leak alert. here's activity class

public class mainactivity extends appcompatactivity {  @override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     setcontentview(r.layout.activity_main);     toolbar toolbar = (toolbar) findviewbyid(r.id.toolbar);     setsupportactionbar(toolbar);      viewpager mviewpager = (viewpager) findviewbyid(r.id.view_pager);     list<fragment> fragments = new linkedlist<>();     (int = 0; < 10; i++) {         fragments.add(customfragment.newinstance(i));     }      mviewpager.setadapter(new custompageradapter(getfragmentmanager(), fragments));     mviewpager.setcurrentitem(0, false); }    public class custompageradapter extends fragmentpageradapter {      private list<fragment> fragments;      public custompageradapter(fragmentmanager fragmentmanager, list<fragment> fragments) {         super(fragmentmanager);         this.fragments = fragments;     }      @override     public fragment getitem(int position) {         return fragments.get(position);     }      @override     public int getcount() {         return fragments.size();     }   } } 

to leak, recyclerview doesn't need initialized. if comment in xml file, leak isn't fired

public class customfragment extends fragment {  public static final string position = "position";  public static customfragment newinstance(int position) {     bundle b = new bundle();     b.putint(position, position);     customfragment fragment = new customfragment();     fragment.setarguments(b);     return fragment; }  private int position; private recyclerview recyclerview;  @override public void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);     position = getarguments().getint(position); }  @nullable @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) {     view v = inflater.inflate(r.layout.fragment_custom, container, false);     textview textview = (textview) v.findviewbyid(r.id.text);     textview.settext("position: "+position);     recyclerview = (recyclerview) v.findviewbyid(r.id.pulse_recyclerview);     return v; }  @override public void ondestroy() {     super.ondestroy();     refwatcher refwatcher = customapplication.getrefwatcher(getactivity());     refwatcher.watch(this);   } } 

here's leak trace. recyclerview version 23.1.1

in com.example.gabin.sampleapplication:1.0:1. * leak can ignored. * com.example.gabin.sampleapplication.mainactivity has leaked: * gc root static android.view.inputmethod.inputmethodmanager.sinstance * references android.view.inputmethod.inputmethodmanager.mcurrootview * references com.android.internal.policy.impl.phonewindow$decorview.mcontext * leaks com.example.gabin.sampleapplication.mainactivity instance * retaining: 3,9 КБ. * reference key: 67c5e9f4-464e-40c3-b21d-d802fe64a84b * device: lge google nexus 4 occam * android version: 5.1.1 api: 22 leakcanary: 1.4-beta1 02804f3 * durations: watch=5035ms, gc=190ms, heap dump=5948ms, analysis=46384ms 

may android bug? please, give idea how fix leak, or me figure out reason of firing leakcanary.

your stack trace shows @ least 2 things:

  1. it not recyclerview leaks activity. imputmethodmanager.
  2. leak can ignored. according leak canary docs known sdk problem. don't think activity leak. if check memory dump not see several activity instances. code looks pretty safe @ now.

Comments

Popular posts from this blog

java - pagination of xlsx file to XSSFworkbook using apache POI -

Unlimited choices in BASH case statement -

apache - How do I stop my index.php being run twice for every user -