我有一个控制多个片段的活动。默认片段是HomepageFragment. 当替换到不同的 Fragment 时,我总是确保堆栈保持平坦 - 这意味着只有HomepageFragment保持在堆栈中并在其顶部是当前 Fragment。例如:
HomepageFragmentFragmentA需要替换 to - 一切都是好的原因HomepageFragment是最后一个 FragmentHomepageFragment->FragmentA FragmentB需要替换为- 首先弹出堆栈上的最后一个 Fragment ( fragmentA) 然后替换为FragmentBHomepageFragment->FragmentB在生产中,我看到很多TransactionTooLargeException崩溃。
我曾经TooLargeTool跟踪问题的来源,我发现当我在活动中的片段之间切换时,其中有一个android:support:fragments键SaveInstanceState变得越来越大(呈指数级),直到发生崩溃。
似乎即使从堆栈中弹出时,有关原始事务的一些数据也会继续保存。
按照此处的建议将其删除会导致 Activity 在被操作系统杀死后无法正确恢复。
我压平堆栈的方法有什么问题吗?有没有更好的方法?究竟保存在什么数据下android:support:fragments?
注意:我没有为这些片段设置任何参数。此外,它们在其 saveInstanceState 包中保存了非常小的数据。
谢谢!
android android-fragments android-activity onsaveinstancestate transactiontoolargeexception
我们最近发布了一个 ReactNative 应用程序,但我们收到了许多关于 android 的崩溃报告,其中包含java.lang.RuntimeExceptionBinder.java android.os.TransactionTooLargeException: data parcel size X(between 400k to 750k) bytes.
在我们的应用程序中,我们有一个无限滚动列表(Flatlist),它可以变得非常大(2k + 记录),这被怀疑是导致此问题的原因。我已经看到https://github.com/facebook/react-native/issues/19458打开了,但没有解决方案。还使用建议的工具(TooLargeTool)在那里指出在进入后台时会保存 0 个字节。
有没有人解决过这个问题或对如何解决它有任何意见?
谢谢
android react-native react-native-android transactiontoolargeexception
我正在制作使用 Binder 相互通信的小型 Android 应用程序。
据我所知,Android Binder 具有最大事务大小 (1MB)。例如,TransactionTooLargeException当应用程序尝试使用 Binder 事务发送大于 1MB 的消息时抛出。
我不明白为什么这是有限的。是否有任何理由限制最大交易大小?LinuxSOCK_STREAM也是 IPC,但它没有限制。
这个限制有什么合理的理由吗?Android 文档似乎没有解释为什么他们将事务大小限制为 1MB。(“Binder 事务缓冲区有一个有限的固定大小”那么他们为什么要限制缓冲区?)。
如果框架没有限制 IPC 大小,是否有任何关键情况?据我所知,即使没有最大 IPC 大小的限制,Linux 也能很好地工作。
我使用 ViewPager(offscreenPageLimit默认为 1)和 FragmentStatePagerAdapter 编写了一个阅读器应用程序,其中我有
override fun getItem(position: Int) = ComicFragment.newInstance(index = position + 1)
Run Code Online (Sandbox Code Playgroud)
这里创建了一个index可能大于2000的ComicFragment,具有这样索引的漫画将被加载到片段中。默认setRetainInstance为 false
同样在片段中,我将索引和布尔值保存transMode在savedInstanceState中,这样当用户来回滑动几页时,他们将使页面处于与原来相同的状态。它还将维护配置更改的状态。
问题是,随着每个片段从TooLargeTool中滑走,就会出现
D/TooLargeTool: ComicFragment.onSaveInstanceState wrote: Bundle126358192 contains 4 keys and measures 0.8 KB when serialized as a Parcel
* androidx.lifecycle.BundlableSavedStateRegistry.key = 0.1 KB
* transMode = 0.0 KB
* android:user_visible_hint = 0.1 KB
* android:view_state = 0.6 KB
* fragment arguments = Bundle247579945 contains 1 keys and measures 0.0 KB when serialized as …Run Code Online (Sandbox Code Playgroud) android android-viewpager fragmentstatepageradapter transactiontoolargeexception
我正在开发生产应用程序。我在 Crashlytics 中收到异常。我不知道发生了什么,因为它没有指向任何活动。只是我收到这样的错误。
Caused by android.os.TransactionTooLargeException: data parcel size 5971992 bytes
at android.os.BinderProxy.transactNative(BinderProxy.java)
at android.os.BinderProxy.transact(BinderProxy.java:1179)
at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:3969)
at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:144)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6898)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Run Code Online (Sandbox Code Playgroud)
是否有任何工具/库可以检测此问题
我也检查了这个链接对 TransactionTooLargeException 做什么
我试过这个工具https://github.com/guardian/toolargetoo它对我没有帮助。你能分享你的想法吗
我正在使用RETROFIT进行api调用,我从服务器接收到JSON响应,该响应的大小几乎不超过30kb。JSON将响应解析为复杂的Object时,会引发此错误。
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)
Run Code Online (Sandbox Code Playgroud)
如果尝试将响应存储在Object类中,然后通过LinkedHashMap获取值,则可以获取数据。但是,这将是一个乏味的过程。
谁能帮助我找出问题所在以及如何找到解决方案?
根据我的研究,这仅适用于版本> = Nougat的android设备。在此之下,它像小菜一碟。
我也尝试了以下提到的一些解决方案:-> onSaveInstanceState.clear()-但这不起作用。 你可以在这里找到帖子
java android exception parcelable transactiontoolargeexception
android ×6
transactiontoolargeexception ×6
exception ×1
ipc ×1
java ×1
kotlin ×1
parcelable ×1
react-native ×1