【问题标题】:TransactionTooLargeException when Activity is PausedActivity 暂停时的 TransactionTooLargeException
【发布时间】:2017-11-13 17:03:23
【问题描述】:

我正在创建一个应用程序,并在其中将Bundle 中的非常大的数据从Service 发送到Activity。但我没有为此使用Messenger。相反,我将数据分配给单例类中的变量,然后从该单例类中检索数据并将其分配给活动。

Activity 中,我有一个ViewPager,其中膨胀了两个片段。 Bundle 被发送到这两个Fragment 类。

现在,当 Activity 暂停时,应用程序会抛出以下异常:

at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4209)
                                                                        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:6776)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        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 4538408 bytes
                                                                        at android.os.BinderProxy.transactNative(Native Method)
                                                                        at android.os.BinderProxy.transact(Binder.java:628)
                                                                        at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:4183)
                                                                        at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4201)
                                                                        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:6776) 
                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

请帮忙。

【问题讨论】:

    标签: java android android-fragments exception transactions


    【解决方案1】:

    捆绑包被发送到这两个片段类。

    不要将大的东西放入保存的实例状态Bundle。在片段的情况下,“参数”Bundle (setArguments()) 成为保存的实例状态Bundle 的一部分,因此不要将大的东西放入参数Bundle。保存的实例状态Bundle 用于微小的数据:尽可能少,但足以让您在进程终止后恢复您的 UI 状态。

    相反,做其他事情,例如:

    • 让片段调用托管活动上的方法来获取此数据,或者
    • 使用ViewModel,以便在配置更改时保留此数据,但不属于保存的实例状态Bundle

    【讨论】:

      【解决方案2】:

      来自Android Developers - TransactionTooLargeException

      Binder 事务缓冲区有一个有限的固定大小,目前为 1Mb

      还有类似的问题: What to do on TransactionTooLargeException

      实际数据大小约为 500kb,IPC 事务缓冲区大小设置为 1024KB。

      因此,数据包大小 4538408 字节 (4MB) 太大而无法一次发送。拆分它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多