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:
- it not recyclerview leaks activity. imputmethodmanager.
- 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
Post a Comment