android.os.TransactionTooLargeException:数据包大小 NOUGAT 错误
android.os.TransactionTooLargeException: data parcel size NOUGAT ERROR
我正在使用 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)
如果我尝试将响应存储在对象 class 中,然后通过 LinkedHashMap 获取值,我就能够获取数据。但是,这将是一个乏味的过程。
谁能帮我弄清楚这里的问题是什么以及如何找到解决方案?
根据我的研究,这只发生在 android 版本 >= Nougat 的设备上。在此之下,它就像小菜一碟。
我也尝试过一些提到的解决方案:
--> onSaveInstanceState.clear() - 但这不起作用。
这是将大量数据放入 Android 的 Bundle 时的典型错误。
我建议你做对。大数据必须持久保存到磁盘(数据库或文件),您只需将此数据的引用传递到其他地方即可使用它。
在这里您可能会觉得30kb 很小,但是Bundle 的大小限制的实际配置可能会因不同的devices/vendors 配置而有所不同。
Bundle 旨在仅保留简单和小的数据,不要过度滥用它。
我正在使用 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)
如果我尝试将响应存储在对象 class 中,然后通过 LinkedHashMap 获取值,我就能够获取数据。但是,这将是一个乏味的过程。
谁能帮我弄清楚这里的问题是什么以及如何找到解决方案?
根据我的研究,这只发生在 android 版本 >= Nougat 的设备上。在此之下,它就像小菜一碟。
我也尝试过一些提到的解决方案:
--> onSaveInstanceState.clear() - 但这不起作用。
这是将大量数据放入 Android 的 Bundle 时的典型错误。
我建议你做对。大数据必须持久保存到磁盘(数据库或文件),您只需将此数据的引用传递到其他地方即可使用它。
在这里您可能会觉得30kb 很小,但是Bundle 的大小限制的实际配置可能会因不同的devices/vendors 配置而有所不同。
Bundle 旨在仅保留简单和小的数据,不要过度滥用它。