作者:兜子
故障背景
最近遇到一个问题,在Activity使用Intent跳转的时候部分机型会出现程序异常,造成App闪退,android.os.TransactionTooLargeException,特别是在Android7.0的时候容易复现。查阅资料的时候,发现是因为IPC缓存区最大为1024KB,这意味着Activity在使用intent跳转的时候,正在尝试将其保存的状态Bundles发送到系统操作系统,以便数据得到安全保留,但是它发送的Bundles太大了,超过了系统IPC缓存区的最大限制。这里的主要罪魁祸首通常是在Activity或Activity托管的任何Fragments onSaveInstanceState中保存太多数据,导致的异常崩溃。
解决方案
1.不需要在用户再次打开程序的时候恢复数据的情况下,可以把旧的状态清除
@Override
protected void onSaveInstanceState(Bundle oldInstanceState) {
super.onSaveInstanceState(oldInstanceState);
oldInstanceState.clear();
}
2.确实要传参或者保留视图状态的情况下,官方推荐是使用缓存
- 内存缓存
- 磁盘缓存
通过内存或者磁盘缓存的数据来恢复状态,这两个目标策略都可以帮助程序避免出现异常,又不会牺牲程序保存视图状态的能力。
3.可以使用Google推出的官方架构中的Room持久性库,来达到优化程序的效果。