What to do on TransactionTooLargeException

前端 未结 30 3339
盖世英雄少女心
盖世英雄少女心 2020-11-22 03:08

I got a TransactionTooLargeException. Not reproducible. In the docs it says

The Binder transaction failed because it was too large.

D

30条回答
  •  终归单人心
    2020-11-22 03:39

    For me it was also the FragmentStatePagerAdapter, however overriding saveState() did not work. Here's how I fixed it:

    When calling the FragmentStatePagerAdapter constructor, keep a separate list of fragments within the class, and add a method to remove the fragments:

    class PagerAdapter extends FragmentStatePagerAdapter {
        ArrayList items;
    
        PagerAdapter(ArrayList frags) {
            super(getFragmentManager()); //or getChildFragmentManager() or getSupportFragmentManager()
            this.items = new ArrayList<>();
            this.items.addAll(frags);
        }
    
        public void removeFragments() {
            Iterator iter = items.iterator();
    
            while (iter.hasNext()) {
                Fragment item = iter.next();
                    getFragmentManager().beginTransaction().remove(item).commit();
                    iter.remove();
                }
                notifyDataSetChanged();
            }
        }
        //...getItem() and etc methods...
    }
    

    Then in the Activity, save the ViewPager position and call adapter.removeFragments() in the overridden onSaveInstanceState() method:

    private int pagerPosition;
    
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //save other view state here
        pagerPosition = mViewPager.getCurrentItem();
        adapter.removeFragments();
    }
    

    Lastly, in the overridden onResume() method, re-instantiate the adapter if it isn't null. (If it's null, then the Activity is being opened for the first time or after the app has been killed off by Android, in which onCreate will do the adapter creation.)

    @Override
    public void onResume() {
        super.onResume();
        if (adapter != null) {
            adapter = new PagerAdapter(frags);
            mViewPager.setAdapter(adapter);
            mViewPager.setCurrentItem(currentTabPosition);
        }
    }
    

提交回复
热议问题