最小化应用程序时出现 TransactionTooLargeException

TransactionTooLargeException when minimizing app

我 close/minimize 我的应用程序出现 TransactionTooLargeException。我假设这是由于我的 Bundle 太大(3 个 JSONArrays 作为字符串),但如果有人可以从我的错误跟踪中诊断出更多信息,那就太好了。

这里是:

05-28 17:17:25.994 9518-9518/com.adamtrudeauarcaro.godbuilder E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 551100)
05-28 17:17:25.996 9518-9518/com.adamtrudeauarcaro.godbuilder D/AndroidRuntime: Shutting down VM
05-28 17:17:25.998 9518-9518/com.adamtrudeauarcaro.godbuilder E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                Process: com.package.godbuilder, PID: 9518
                                                                                java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 551100 bytes
                                                                                    at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4211)
                                                                                    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:6688)
                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
                                                                                 Caused by: android.os.TransactionTooLargeException: data parcel size 551100 bytes
                                                                                    at android.os.BinderProxy.transactNative(Native Method)
                                                                                    at android.os.BinderProxy.transact(Binder.java:628)
                                                                                    at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:4132)
                                                                                    at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4203)
                                                                                    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:6688) 
                                                                                    at java.lang.reflect.Method.invoke(Native Method) 
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) 
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) 

从你的错误跟踪中它没有说,但我可以根据经验肯定地告诉你,当你的包太大而无法将其存储为已保存的实例状态时,就会发生这种情况。这意味着当您最小化应用程序时,它会尝试调用 onSaveInstanceState 并且您的捆绑包存储的数据超过系统支持的数据。

我也遇到过这个异常。场景是我们通过 Bundle 将相册中所有图片或视频的路径传递给预览片段,通常是可以的,但是当用户设备中有数千个文件时,就会出现问题。当activity停止,应用程序被系统回收时会抛出异常,这期间参数数据会通过binder传递给系统,以便稍后恢复。这是异常跟踪:

Thread Name: 'main' Back traces starts. java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 2352912 bytes at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:161) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:263) at android.app.ActivityThread.main(ActivityThread.java:8246) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1006) Caused by: android.os.TransactionTooLargeException: data parcel size 2352912 bytes at android.os.BinderProxy.transactNative(Native Method) at android.os.BinderProxy.transact(BinderProxy.java:568) at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4429) at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145) ... 7 more Back traces ends.

为了解决这个问题,我们在当前点击的图片或视频周围只限制了一百条路径。这是代码。

    val selections = ArrayList<Selection>()
    // The number of pictures in user device can be more than 1000.
    // Restrict the list size to fix TransactionTooLargeException: data parcel size too large.
    val interval = 100
    val start: Int = max(0, position - interval / 2)
    val end: Int = min(materials.size - 1, start + interval)
    for (i in start..end) {
        val albumItem: IAlbumItem = materials[i]
        val selection = Selection(Triple("null", i, -1), Pair(-1, -1), albumItem)
        selection.what = what
        selections.add(selection)
    }

    val bundle = Bundle()
    // The collection has changed, the position should offset the same too.
    bundle.putLong("limitVideoDuration", limitVideoDuration)
    bundle.putInt("position", position - start)
    bundle.putSerializable("selections", selections)