J.Z*_*ang 5 android android-viewpager fragmentstatepageradapter transactiontoolargeexception
我使用 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 a Parcel
* index = 0.0 KB
Run Code Online (Sandbox Code Playgroud)
0.8 KB 并不大,但它累积在 viewpager 的父片段及其容器 Activity 中。这意味着当从索引1到1000浏览时,父片段的状态中将保存800 KB。当我开始一个新的活动时,它达到了 TransactionTooLargeException 的 1MB 的红线。(实际上,即使捆绑包大小约为 500KB,也可能会发生此异常)
更糟糕的是父片段中的状态包没有被释放。我发现通过这样的实现,如果我从 1 浏览到 100,然后反向浏览回 1,保存的状态可以应用于每个片段但不会释放,因为父片段中状态包的大小加倍为 160 KB,而不是 80 KB。
我几乎没有在捆绑包中放入任何东西,也不敢添加任何更大的东西,例如可序列化的东西,因为本机android:view_state可能足以引起问题。
我想知道应该如何改进实现,是否可以轻松修复,或者使用 Android 架构组件、ViewPager2 或其他依赖项等更重的东西。
更新:
我试过了
view.isSaveFromParentEnabled = false在onViewCreated()。
savedInstanceState?.clear()在......的最后onViewCreated()。
android:saveEnabled="false"到那些带有 id 的视图,但不需要保存。
这三种方式中,只有第三种有效。
D/TooLargeTool: ComicFragment.onSaveInstanceState wrote: Bundle242738747 contains 1 keys and measures 0.1 KB when serialized as a Parcel
* androidx.lifecycle.BundlableSavedStateRegistry.key = 0.1 KB
* transMode = 0.0 KB
* fragment arguments = Bundle232075608 contains 1 keys and measures 0.0 KB when serialized as a Parcel
* index = 0.0 KB
Run Code Online (Sandbox Code Playgroud)
android:view_state已被完全消除,因为我没有任何需要保持状态的视图(EditText、ToggleButton)。
这个问题还没有完全解决,但我相信现在异常的几率已经降低了 8 倍,而且功能上没有受到影响。
| 归档时间: |
|
| 查看次数: |
943 次 |
| 最近记录: |