一、问题描述

根据经验,看到这个问题描述,第一时间想到的是 Intent 传递了太大的数据,但是进行堆栈分析后,发现并不是我想的这样

二、堆栈分析

查看出错的堆栈

可以看到崩溃是出现在某个 Activity stop 的时候,跟 intent 传递数据是不符合的,查看出错的页面

是在 PictureSelectActivity onPaused 后崩溃的,也确实和 intent 传递数据没什么关系

从堆栈中我们可以看到调用了 BinderProxy.transact 方法,然后调用到了 native 层,我们顺腾摸瓜,最后找到了报错代码

parcelSize 只要大于 200KB,就会报错,而 parcelSize 则对应于 BinderProxy.transact 方法的 Parcel data 对象,那么问题就指向了为何 data 会超过 200KB

但是现在有个疑问是,到底要怎样才能复现崩溃呢?因为我们现在知道了报错代码,但是并不知道什么场景会报错。

三、尝试复现问题

通过对页面数据的排查,发现出错的页面都是 PictureSelectActivity,且都是在该 Activity onPause 之后出错的,那么查询代码,看 PictureSelectActivity onPause 之后做了什么呢?

可能1:

上面是选完图片后,通过 setResult 把数据传递回上一个 Activity,只是传了一个 urlList,数据量并不大,所以排除这个可能

可能2:

PictureSelectActivity 中有几个 Fragment,Activity 与 Fragment 之间传递数据使用了 Bundle,但是查看代码后发现传递的数据量很小,且不符合

ActivityStop 的时机,排除

可能3:

通过查阅资料

https://www.cnblogs.com/tgltt/p/9834584.html

找到另外一种可能

问题原因:FragmentStatePagerAdapter 的 saveState() 实现有缺陷,因为其默认实现会持续保存历史Fragment实例的状态数据历史,在逐渐地积累、保存数据后,最终导致发送的数据包体积超过限制200KB 。

saveState 被 ViewPager 的 onSaveInstanceState 调用了

当activity有可能被系统回收的情况下,系统将调用 Activity 的 onSaveInstanceState(Bundle outState) 进行数据的保存,以便 activity 重新创建的时候,可以恢复数据,而 Activity 的 onSaveInstanceState(Bundle outState)

被调用后会调用 View 的 onSaveInstanceState

onSaveInstanceState(Bundle outState)会在以下情况被调用:
1、当用户按下HOME键时。
2、从最近应用中选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从当前activity启动一个新的activity时。
5、屏幕方向切换时(无论竖屏切横屏还是横屏切竖屏都会调用)。

在前4种情况下,当前activity的生命周期为:

onPause -> onSaveInstanceState -> onStop

为了印证这种可能,我们让 PictureSelectActvity 的图片浏览器浏览了 500 张图片,然后按下 HOME 键,这时候果然出现了崩溃,也就印证了崩溃的原因了

总结:问题的原因是 当 Activity 被隐藏时,其 onSaveInstanceState(Bundle outState) 被调用进行数据的保存,最终调用了 FragmentStatePagerAdapter 的 saveState(),而 saveState() 实现有缺陷,因为其默认实现会持续保存历史Fragment实例的状态数据历史,在逐渐地积累、保存数据后,最终导致发送的数据包体积超过限制200KB 。

四、解决问题

重写 FragmentStatePagerAdapter 的 saveState() ,saveState() 的时候不保存任何的数据

影响范围:因为保存的数据只有在 Activity 被回收,然后恢复 Activity 的时候有用,而这种情况下不恢复之前的状态其实影响不大,所以这种方案是可行的

为了避免其他业务也出现类似的情况,所以封装出一个基类,只有那些 ViewPager 的页数比较多的场景才需要继承这个类

解决线上概率性异常 TransactionTooLargeException相关推荐

  1. 怎么解决线上CPU100%的问题

    怎么解决线上CPU100%的问题 背景 Java服务,有时候会遇到CPU 100%的问题,对于这样的问题,我们如何快速定位并解决呢?一般会有如下几个步骤. 解决步骤 找到最耗CPU的进程 top 找到 ...

  2. 听说”双11”是这么解决线上bug的

    听说"双11"是这么解决线上bug的 --Android线上热修复的使用与原理 预备知识和开发环境 Android NDK编程 AndFix浅析 Android线上热修复的原理大同 ...

  3. iOS app崩溃率,如何解决线上闪退

    //联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄 1.如何追踪app崩溃率,如何解决线上闪退 当iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.cra ...

  4. c语言二级闪退有分数嘛,c语言文件1.怎样追踪app崩溃率。怎样解决线上闪退 当iO(2)...

    市场上已有的商业软件提供crash收集服务,这些软件基本都提供了日志存储,日志符号化解析和服务端可视化管理等服务: Crashlytics () Crittercism () Bugsense () ...

  5. 程序员如何优雅地解决线上问题?

    身为一个程序员,遇到线上问题那都是家常便饭的事儿. 如果你在深夜看到一群同事围在一起,他们是在共同探讨什么哲学问题么?非也,他们一定是遇到了线上BUG. 线上问题只要影响到了核心业务流程那便是事故,所 ...

  6. 百度单测生成技术如何召回线上服务的异常问题?

    导读:线上系统异常问题一直以来都是使人"闻风丧胆"的,传统手段在解决这类问题时面临着相应的技术瓶颈.基于此,探索基于单元测试召回异常问题的方法,实现了一套通用且无人参与的单测生成系 ...

  7. MySQL排查篇:该如何定位并解决线上突发的Bug与疑难杂症?

    前面两章中,聊到了关于数据库性能优化的话题,而本文则再来聊一聊关于MySQL线上排查方面的话题.线上排查.性能优化等内容是面试过程中的"常客",而对于线上遇到的"疑难杂症 ...

  8. 线上发生死锁异常了,该怎么办

    前言 MySQL 死锁异常是我们经常会遇到的线上异常类别,一旦线上业务日间复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常.这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,并且分 ...

  9. mysql在线检测失败_一则线上MySql连接异常的排查过程

    Mysql作为一个常用数据库,在互联网系统应用很多.有些故障是其自身的bug,有些则不是,这里以前段时间遇到的问题举例. 问题## 当时遇到的症状是这样的,我们的应用在线上测试环境,JMeter测试过 ...

最新文章

  1. Java 泛型 T,E,K,V,?,傻傻分不清?
  2. 机器学习模型越来越大,开发者应该如何部署?
  3. python hook技术,python hook监听事件详解
  4. python读取文件多行内容-Python读取文件、大文件和指定行内容的几种方法
  5. centos7安装tomcat8.5.46版本
  6. C# 数据适配器之 DataAdapter 对象
  7. mysql 字符转数组_mysql下将分隔字符串转换为数组
  8. Perl 字符串截取函数substr
  9. 0基础学python做什么工作好-零基础学Python,越早明白这些,越快找到好工作!...
  10. asp怎么循环增加字段和字段对应的值_索引该怎么创建?
  11. Mac盖上屏幕后外接屏幕持续黑画面的解决方法
  12. 转: Rust中的Pin详解 【Rust语言中文社区】
  13. 小技巧:Win7屏保变梦幻桌面
  14. liteon460w服务器电源管理系统,PS-5251-06 LITEON光宝工业电源
  15. W11系统VMware网卡vmnet8显示未识别的网络
  16. svn update 时报错 Node remains in conflict 和解决方法
  17. android avm灰色,APICloud AVM多端开发案例深度解析(上)--点餐app开发
  18. 我如何构建heimdall开源个人电子邮件监护人
  19. 【allegro 17.4软件操作保姆级教程九】布线后检查与调整
  20. 浅谈LCD液晶屏和电子墨水屏的区别

热门文章

  1. 五邑大学安卓开发程序设计报告_五邑大学模拟电路课程设计报告模板.docx
  2. 网页聊天气泡效果实现
  3. 四轮转向系统横摆角速度控制simulink仿真模型,利用滑模控制算法,基于八自由度车辆模型
  4. 《船舶流体力学》知识点总结——1.绪论
  5. 断言信息与元素等待_Sinno_Song_新浪博客
  6. 【详解】机器学习库-Matplotlib+Numpy+Pandas
  7. QT 图片浏览器(一)
  8. 什么是云渲染?【谈谈云渲染和传统渲染农场的区别】
  9. 手持弹幕android制作,手持弹幕神器
  10. Ruby on Rails 新版本