Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I had the same problem. But in my case ViewPager was inside of the another fragment. and after removing ViewPagerFragment from FragmentManager, all fragments from FragmentStatePagerAdapter stays in fragment manager. so after few such changes it was OutOfMemoryError. Then I switch on FragmentManager logs by:</p> <pre><code>FragmentManager.enableDebugLogging(true); </code></pre> <p>And found that id of every new fragment inreases every time. It happens only with StatePagerAdapter. To solve this problem I call remove for every fragment that was instantinated.</p> <pre><code>protected void dispatchOnDetach(Iterable&lt;Fragment&gt; fragments) { if (fragments == null) return; Activity aa = getActivity(); if (aa == null) return; IBaseActivity ba = (IBaseActivity) aa; if (ba.isActivityStopped()) return; FragmentManager frMan = ba.getSupportFragmentManager(); FragmentTransaction frTr = frMan.beginTransaction(); for (Fragment fr : fragments) { if (fr != null) { frTr.remove(fr); } } frTr.remove(this); frTr.commit(); } </code></pre> <p>In your case. if you do not change ViewPager during runtime it is possible, that garbage collector can not destroy your fragments even after removing from fragment manager because of some references to them. You should check if some global classes use them.</p> <p>And for optimizations purposes you could cache every instantinated fragment using SoftReference or LruCache. Example:</p> <pre><code>public class MyAdapter extends FragmentStatePagerAdapter { private final LruCache&lt;Integer, Fragment&gt; mCache; public MyAdapter(FragmentManager fm) { super(fm); mCache = new LruCache&lt;Integer, Fragment&gt;(10); } @Override public int getCount() { return NUM_ITEMS; } @Override public Fragment getItem(int position) { return mCache.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); } private class MyCache extends LruCache&lt;Integer, Fragment&gt; { public MyCache(int maxSize) { super(maxSize); } @Override protected Fragment create(Integer key) { return ArrayListFragment.newInstance(key); } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload