Android.os.TransactionTooLargeException: 数据包大小 NOUGAT 错误

7
我正在使用RETROFIT进行API调用,我从服务器获取了JSON响应,其大小不到30kb。在将JSON解析为复杂对象时,出现了以下错误。
java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 1098852 bytes
    at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:161)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
 Caused by: android.os.TransactionTooLargeException: data parcel size 1098852 bytes
    at android.os.BinderProxy.transactNative(Native Method)
    at android.os.BinderProxy.transact(BinderProxy.java:510)
    at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4524)
    at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145)
    at android.os.Handler.handleCallback(Handler.java:883) 
    at android.os.Handler.dispatchMessage(Handler.java:100) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7356) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

如果我尝试将响应存储在Object类中,然后通过LinkedHashMap获取值,我就能够获取数据。但是,这将是一个繁琐的过程。
请问有人能帮助我找出问题所在并找到解决方案吗?
根据我的研究,这只会发生在Android版本>=Nougat的设备上。在此之下,它就像一块蛋糕一样工作。
我还尝试了一些在以下链接中提到的解决方案: ---> onSaveInstanceState.clear() - 但这行不通。 您可以在此处找到该帖子。
1个回答

10
这是在将大量数据放入Android的Bundle中时出现的典型错误。
我建议您做正确的事情。大量数据必须持久保存到磁盘(数据库或文件),并且只向其他位置传递此数据的引用以消耗它。
在这里,您可能会发现30kb很小,但Bundle的大小限制实际上可能因不同设备/供应商配置而异。
Bundle旨在仅保留简单和小型数据,请勿过度滥用。

1
好的。通过切片复杂对象并仅使用那些正在使用的键来解决了问题。感谢@toantran。 - lajeet

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