【问题标题】:TransactionTooLargeException only on Nougat [duplicate]TransactionTooLargeException 仅适用于 Nougat [重复]
【发布时间】:2017-09-13 22:54:37
【问题描述】:

我开发了一款在 Android 版本低于 Nougat 的设备上运行良好的应用。

当我在带有 Nougat 的设备上启动应用程序并按下主页按钮时,应用程序崩溃并且在 logcat 中我有:

!!! FAILED BINDER TRANSACTION !!!  (parcel size = 1819712)
Unhandled exception
java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 1819712 bytes
    at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3781)
    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:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
 Caused by: android.os.TransactionTooLargeException: data parcel size 1819712 bytes
    at android.os.BinderProxy.transactNative(Native Method)
    at android.os.BinderProxy.transact(Binder.java:615)
    at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3636)
    at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3773)
    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:6119) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

有简单的解决方案吗?此问题仅出现在 Nougat 上。

【问题讨论】:

  • 这意味着你在onSaveInstanceState()Bundle中写入了太多数据。
  • 不,我没有传递位图。案例是为什么应用程序在 android 7.0/7.1 上无法正常运行,但在较低版本上一切正常。
  • 嗯,崩溃表明您正在向这个包裹写入1819712 字节。这在任何版本的 Android 上都会失败。无论出于何种原因,您的数据量都大幅增长。由于我们看不到您的代码,因此我们无法真正告诉您它是如何或为何如此增长的。
  • 我正在寻找它在较低版本上工作的原因。找到后我会发布解决方案。
  • @nuka_cola 在早于 Nougat 的版本上这不是问题的原因是这曾经是一个无声的失败。它只是升级为牛轧糖的崩溃。 Nougat behavior changes 讨论了这一点:“系统现在将 TransactionTooLargeExceptions 重新抛出为 RuntimeExceptions,而不是静默记录或抑制它们。一个常见的例子是在 Activity.onSaveInstanceState() 中存储了太多数据,这会导致 ActivityThread.StopInfo 在您的应用面向 Android 7.0。”

标签: android android-7.0-nougat parcel android-7.1-nougat


【解决方案1】:

来自TransactionTooLargeException 类的文档

Binder 事务缓冲区有一个有限的固定大小,目前为 1Mb,该大小由该进程正在进行的所有事务共享。因此,当有许多事务正在进行时,即使大多数单个事务的大小适中,也可能会引发此异常。

您是否检查过您在较低的 android API 上传递的数据大小?

我建议在您在 android 7.0/7.1 和其他系统上传输数据之前记录此大小。可能在不同的android版本上,你的数据占用的内存量不同。

【讨论】:

    【解决方案2】:

    这里也一样。这个问题没有快速的解决方案。

    我的解决方案是将数据临时存储在数据库或文件中。 也只是在活动和片段之间传输只需要的数据。

    我认为对于大多数具有大量数据的用例来说,这也是一种更好的设计模式。

    【讨论】:

      【解决方案3】:

      如果活动中有几个片段并且每个片段都在执行 onSaveInstance,则会发生更多。如果fragment onCreateView总是要重启视图(没有视图状态需要os来恢复),那么rootview.setSaveFromParentEnabled(false);防止视图的 onSaveInstanceState()。这可能会有所帮助。

      【讨论】:

        【解决方案4】:

        我也有同样的问题。这已经被谷歌论坛上的许多开发者抱怨了。他们的答案是 WAI(按预期工作),因为他们不建议在该州保存太多数据。 所以建议是只向 Intent 添加非常基本的参数。 如果要在 Activity 或 Fragment 之间发送数据,

        • 将数据存储在(临时)文件中并传递文件 URI。 如果您想转移,此选项可能是您唯一的选择 大量数据到一个完全不同的应用程序。存储数据 在应用程序实例中;
        • 创建一个包含 您传递的数据。
        • 如果您使用的是 FragmentStatePageAdapter,请添加以下代码以避免它保存状态数据。

          @Override    
          public Parcelable saveState() {
                  Bundle bundle = (Bundle) super.saveState();
                  bundle.putParcelableArray("states", null); // Never maintain any states from the base class to avoid TransactionTooLargeException
                  return bundle;
          }
          

        参考:

        https://issuetracker.google.com/issues/37103380

        https://www.neotechsoftware.com/blog/android-intent-size-limit

        【讨论】:

        • 你在我的生活中节省了一些日子。非常感谢
        【解决方案5】:

        我通过将数据保存在文件中解决了这个问题。感谢您的所有回答。

        【讨论】:

          猜你喜欢
          • 2015-08-15
          • 2019-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-29
          • 2014-03-25
          • 2020-07-20
          • 2012-10-08
          相关资源
          最近更新 更多