我如何弄清楚导致android.os.TransactionTooLargeException的原因

时间:2017-04-21 20:52:13

标签: android

我有一个例外,它在Android 7上发生了很多,而在下面的版本上却很少。我不知道如何重现它,我只看到有关崩解剂的报道。

我并不真正在活动之间或与服务之间传递数据。我确实在我的一个活动的onSaveInstanceState方法上保存了一些WebView的状态,但我已经这样做多年了,我不知道为什么它会突然引起问题。

有什么想法吗?

这是一个例外:

Fatal Exception: java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 1405624 bytes
       at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4156)
       at android.os.Handler.handleCallback(Handler.java:751)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6682)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
Caused by android.os.TransactionTooLargeException: data parcel size 1405624 bytes
       at android.os.BinderProxy.transactNative(Binder.java)
       at android.os.BinderProxy.transact(Binder.java:628)
       at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:4149)
       at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4148)
       at android.os.Handler.handleCallback(Handler.java:751)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6682)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

感谢。

1 个答案:

答案 0 :(得分:3)

烨!从Android 7.0(牛轧糖)the system will crash if the data in onSaveInstanceState is too large开始。

你必须想出另一种保存和恢复状态的方法。

http://blog.sqisland.com/2016/09/transactiontoolargeexception-crashes-nougat.html

请注意Dianne Hackborn的评论:

  

Dianne Hackborn 2016年9月18日上午10:52

     

它比固定大小限制更复杂。每个过程都有一个   用于接收传入事务的固定缓冲区,大小为1MB。   从技术上讲,你可以说最大尺寸是1MB,但这是假设的   没有其他IPC发生。在实践中,你永远不应该   一个接近那个的大小,或者偶尔冒险   当有许多其他并发的IPC正在进行时失败。

     

对于已保存状态的特定情况,您还希望保持此小   因为这里提供的是系统需要保留的数据   只要用户可以导航,就可以在系统进程中使用   回到那个活动(即使活动的过程被杀死)。

     

所以我建议保持保存状态低于100K,并且   真的不到50K,而且在大多数情况下甚至远低于此。