如何确定导致android.os.TransactionTooLargeException的原因

3

我遇到了一个在Android 7上经常出现,但在低版本上很少出现的异常。我不知道如何重现它,我只看到了Crashlytics上的报告。

我并没有在活动之间或与服务之间传递数据。我只是在其中一个活动的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个回答

3

是的!从Android 7.0(Nougat)开始,如果onSaveInstanceState中的数据太大,系统将会崩溃(链接1)

你需要找到另一种保存和恢复状态的方法。

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

请注意来自 Dianne Hackborn 的评论:
“这比一个固定大小的限制更加复杂。每个进程都有一个用于接收传入事务的固定缓冲区,其大小为1MB。因此,在技术上,您可以说最大大小为1MB,但这假设没有其他IPC在进行中。实际上,您永远不应该将大小设置得接近或超过1MB,否则在同时进行多个IPC时会出现偶然失败的风险。”
“对于保存状态的特定情况,您还希望保持其较小,因为您在此提供的任何数据都是系统需要长时间保存在系统进程中的数据,即使活动进程被杀死,只要用户能够回到该活动。”
“因此,我建议保持保存的状态远小于100K,实际上远小于50K,大多数情况下甚至比那还要小。”

注意,许多东西会增加保存状态的大小 - 例如片段状态。 - ephemient
谢谢您提供的所有信息。我可能甚至不需要保存这些 Web 视图。下周我将进行测试,以确定可以删除哪些内容。 - casolorz
一般情况下,传递视图并不是一个好主意。它们很大,并且容易泄漏。看看能否传递一个 URL 或类似的东西。 - Shmuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接