【问题标题】:TransactionTooLargeException when minimizing app最小化应用程序时出现 TransactionTooLargeException
【发布时间】:2017-05-28 21:21:23
【问题描述】:

当我关闭/最小化我的应用程序时,我遇到了 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(),虽然我还不确定。
  • @CommonsWare 我没有定义那个方法,错误仍然是由隐式实现引起的吗?
  • 如果您在 EditText 中有一些大文本,也许。恕我直言,这不太可能。
  • @ZaidMirza:正确。但是,您可以通过这种方式消耗多少空间是有限制的,并且您已经超出了该限制。如果您有数据需要在应用程序终止后继续存在,请将其存储在磁盘上。
  • @ZaidMirza:ArrayList 不会通过魔法进入Bundle。如果您将其放入Bundle,它只会进入Bundle。所以,不要把它放在Bundle

标签: android json exception bundle


【解决方案1】:

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

【讨论】:

  • 太棒了,在更改我的设计之前,我只需要确认这是问题所在。谢谢!
  • 没问题,你也可以在这个帖子里找到几乎允许的金额:stackoverflow.com/questions/12496700/…
【解决方案2】:

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

线程名称:'main' 回溯开始。 java.lang.RuntimeException: android.os.TransactionTooLargeException: 数据包大小 2352912 字节 在 android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:161) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:263) 在 android.app.ActivityThread.main(ActivityThread.java:8246) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1006) 引起:android.os.TransactionTooLargeException:数据包大小2352912字节 在 android.os.BinderProxy.transactNative(本机方法) 在 android.os.BinderProxy.transact(BinderProxy.java:568) 在 android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4429) 在 android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145) ... 7 更多 回溯结束。

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

    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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-23
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多