viewpager+fragment出现TransactionTooLargeException的大坑!!!

最近apk包发给部分测试用户,反馈出现很多崩溃,异常是android.os.TransactionTooLargeException,看表面意思就是传送的数据太大,可是检查代码并没有传输很大的数据啊。

因为项目里的这个页面超级复杂,一层viewpager+fragment嵌套,fragment里面又有第二层viewpager+fragment。

复现崩溃出现的原因、发现当fragment的数量很多时,在左右滑动切换fragment的时候,页面正常显示,但是只要此时,点击任何地方去跳转到其他页面,必崩!

开始查资料,尝试第一种方法,复写FragmentPagerAdapter里面的saveState(),如下:

    @Override
    public Parcelable saveState() {
        Bundle bundle = (Bundle) super.saveState();
        if (bundle != null) {
            bundle.putParcelableArray("states",null);
        }
        return bundle;
    }

 并不起作用,有点头疼。。

尝试第二种方法,因为fragment的数量可以定制,多的时候大概有十几二十几个,每个页面的数据非常多,所以我setOffscreenPageLimit()方法注掉,去掉以后预加载页面数量相当于是1。结果仍然无效果。。。

仔细检查代码,发现第一层fragment向第二层fragment传送了List集合数据,马上注释掉,bundle里面只留下一个id,终于解了!

原因

因为vp给每个fragment都有传递参数A,并且我传递的参数值很大,那么左右滑动vp的时候就会使得页面有多次的传递A值,总值超过了1M,触发了bundle溢出,使得点击跳转的时候发生了闪退。

总结一句话就是不可以将过大的数据放入Bundle去发送。

By LiYing

posted @ 2019-06-22 16:26  WidgetBox  阅读(746)  评论(0编辑  收藏  举报