Android MVVM之SavedStateHandle数据保存之详解与使用。

41 篇文章 1 订阅
5 篇文章 0 订阅

一、介绍

        SavedStateHandle从名字可以看出,是保存状态的。这个类常和MVVM中的ViewModel搭配使用,对页面生命周期的数据状态的缓存与恢复做一个容器。这个容易相对onSaveInstanceState(Bundle)要更强一点,保存的数据类型也比较丰富,数据量也相对较大

二、分析

        分析一个类,最简单的就是从源码看起:

2.1容器集合

  1. regular = mutableMapOf
  2. savedStateProviders = mutableMapOf
  3. liveDatas = mutableMapOf
  4. flows = mutableMapOf

以上都是map集合,都是用来存放key-value,四种集合对应四种不同的场景。

2.2 AIP的介绍

fun <K> set(key: String, value: K, bundle: Bundle) {
    state.set(key, value)

    state.setSavedStateProvider(key, MyProvider(bundle))
    state.set(key, MyStateFlow<K>())

}

    fun <M> get(key: String) {
        state.get<M>(key)
        state.getLiveData<M>(key)
        var initialValue: M? = null
        state.getLiveData(key, initialValue)
        state.getStateFlow(key, initialValue)
    }

        通过数据保存,我们会发现,set的时候没有LiveData类型,那是因为在set的方法时,会对livedata集合进行单独处理

源码

 三、类的介绍

3.1 SavedStateRegistry.SavedStateProvider

该类是一个接口,这个接口提供了一个方法,就是可以返回bundle对象。所以,原来的bundle对象是通过该方法进行保存

3.2 StateFlow

flow为流,stateflow为状态流。在软件生命周期中,字节和流一直是比较常见的资源,特别是流,可以伴随着任何业务和模块。

SavedStateHandle同样也支持流的保存。

关于SateFlow使用了out,我将对out和in做一下解释

out:

在 kotlin 中用 out 表示,kotlin 中的 “out T” 等同于 Java 的 <?extends T>

in:

在 kotlin 中用 in 表示,kotlin 中的 “in T” 等同于 Java 的 <?super T>

    internal class MyStateFlow<out A> : StateFlow<A> {

        //重复缓存的快照
        override val replayCache: List<A>
            get() = TODO("Not yet implemented")

        /**
         * 接受给定的收集器并将值发送到其中。要将值从共享流发送到特定收集器,可以使用collecter.emitAll(流)或collect{…}SAM转换。

        共享流永远不会完成。对Flow.collector或共享流上的任何其他终端操作员的调用从未正常完成。
         * */
        override suspend fun collect(collector: FlowCollector<A>): Nothing {
            TODO("Not yet implemented")
            var a:A
            collector.emit(a)
        }
        //此状态流的当前值
        override val value: A
            get() = TODO("Not yet implemented")
    }

四、总结

        在数据保存的地方,分两种保存方法,但是在数据存储的地方,分四种。所以,不管在保存还是恢复,都需要严格执行SavedStateHandle的规则。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MVVM是指Model-View-ViewModel的架构模式,是MVC(Model-View-Controller)的一种改进版本。MVVM将View的状态和行为抽象化,通过ViewModel将视图UI和业务逻辑分离。 在Android中,MVVM模式可以通过Data Binding框架来实现。Data Binding是一个实现数据和UI绑定的工具,可以方便地实现MVVM开发模式。通过在XML中绑定数据,可以轻松地在Android开发中实现MVVM。 在MVVM中,View指的是Activity/Fragment(XML),它负责将ViewModel传递的数据以喜欢的方式显示出来。View还包括ViewDataBinding,用于将布局文件与ViewModel进行绑定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Android MVVM架构](https://blog.csdn.net/weixin_53431933/article/details/126372227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Android MVVM详解](https://blog.csdn.net/Mubly/article/details/128341646)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值