作者:兜子

故障背景

最近遇到一个问题,在Activity使用Intent跳转的时候部分机型会出现程序异常,造成App闪退,android.os.TransactionTooLargeException,特别是在Android7.0的时候容易复现。查阅资料的时候,发现是因为IPC缓存区最大为1024KB,这意味着Activity在使用intent跳转的时候,正在尝试将其保存的状态Bundles发送到系统操作系统,以便数据得到安全保留,但是它发送的Bundles太大了,超过了系统IPC缓存区的最大限制。这里的主要罪魁祸首通常是在Activity或Activity托管的任何Fragments onSaveInstanceState中保存太多数据,导致的异常崩溃。

解决方案

1.不需要在用户再次打开程序的时候恢复数据的情况下,可以把旧的状态清除

  1. @Override
  2. protected void onSaveInstanceState(Bundle oldInstanceState) {
  3. super.onSaveInstanceState(oldInstanceState);
  4. oldInstanceState.clear();
  5. }

2.确实要传参或者保留视图状态的情况下,官方推荐是使用缓存

  • 内存缓存
  • 磁盘缓存

通过内存或者磁盘缓存的数据来恢复状态,这两个目标策略都可以帮助程序避免出现异常,又不会牺牲程序保存视图状态的能力。
3.可以使用Google推出的官方架构中的Room持久性库,来达到优化程序的效果。