You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

业务Activity因BundlableSavedStateRegistry过大引发TransactionTooLargeException求助

解决TransactionTooLargeException(BundlableSavedStateRegistry.key过大)的方案

1. 修正FragmentContainerView的重复ID问题

你XML里的4个FragmentContainerView使用了同一个ID @+id/fcv_order_top_state,这会导致Fragment状态存储逻辑混乱,重复写入相同状态数据,直接加剧Bundle体积膨胀。必须立即修正,给每个容器分配唯一ID:

<androidx.fragment.app.FragmentContainerView
 android:id="@+id/fcv_order_top_state1"
 android:name="com.dofun.zhw.lite.ui.order.InfoStateFragment1"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_marginHorizontal="@dimen/dp13" />

<androidx.fragment.app.FragmentContainerView
 android:id="@+id/fcv_order_top_state2"
 android:name="com.dofun.zhw.lite.ui.order.InfoStateFragment2"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_marginHorizontal="@dimen/dp13" />

<androidx.fragment.app.FragmentContainerView
 android:id="@+id/fcv_order_top_state3"
 android:name="com.dofun.zhw.lite.ui.order.InfoStateFragment3"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_marginHorizontal="@dimen/dp13" />

<androidx.fragment.app.FragmentContainerView
 android:id="@+id/fcv_order_top_state4"
 android:name="com.dofun.zhw.lite.ui.order.InfoStateFragment4"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_marginHorizontal="@dimen/dp13" />

2. 清理ViewModel中SavedStateHandle的大对象

检查所有ViewModel(DetailVM、EnvCheckVM、OrderComplaintLimitVM)的SavedStateHandle,是否存储了长列表、大字符串、Bitmap这类体积大的数据:

  • 移除SavedStateHandle中的大对象,改用Room数据库、文件存储等方式持久化;
  • 仅在SavedStateHandle中保存数据的标识性信息(比如列表的页码、筛选条件、数据ID),页面恢复时通过标识重新从网络/数据库加载完整数据。

示例:把存储完整列表改为存储筛选条件

// 错误:直接存大列表
savedStateHandle.set("order_list", largeOrderList)

// 正确:存筛选条件,恢复时重新加载
savedStateHandle.set("order_filter", filterParams)

3. 禁用不必要的ViewModel状态保存

如果某些ViewModel的数据不需要在配置变化/进程重启后保留,可以自定义Factory跳过SavedState:

class NoSavedStateViewModelFactory<T : ViewModel>(private val viewModelCreator: () -> T) : ViewModelProvider.Factory {
    @Suppress("UNCHECKED_CAST")
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return viewModelCreator() as T
    }
}

// Activity中使用
private val envCheckVM by viewModels<EnvCheckVM>(factoryProducer = {
    NoSavedStateViewModelFactory { EnvCheckVM() }
})

// Fragment中使用
private val complaintLimitVM by viewModels<OrderComplaintLimitVM>(factoryProducer = {
    NoSavedStateViewModelFactory { OrderComplaintLimitVM() }
})

注意:这种方式下,配置变化(比如旋转屏幕)时ViewModel数据会丢失,仅适用于可重新加载的数据。

4. 检查Fragment的状态保存逻辑

排查所有Fragment的onSaveInstanceState方法,是否有额外写入大量数据到Bundle的操作,移除不必要的存储,仅保留核心状态。

5. 拆分过大的SavedState数据

如果必须保存部分大数据,将其拆分为多个小的Key-Value对,避免单个Key对应的Value体积过大。同时可以考虑压缩数据(比如将大字符串转为GZIP字节数组后存储),但注意压缩和解压缩的性能开销。

内容的提问来源于stack exchange,提问作者Len

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:44:54