• 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

  • 相关阅读:
    Asp.Net MVC 常用开发方式之EF Code First
    整理一下Entity Framework的查询
    C#中yield return用法分析
    SQL Server表和字段说明的增加和更新
    C#中一个问号和两个问号(a ?? b)的作用
    你应该知道的25道Javascript面试题
    ASP.NET Core Razor 页面路由
    ASP.NET Core MVC – Tag Helper 组件
    ASP.NET Core 防止跨站请求伪造(XSRF/CSRF)攻击
    ASP.NET Core 使用Cookie验证身份
  • 原文地址:https://www.cnblogs.com/widgetbox/p/11069304.html
Copyright © 2020-2023  润新知