首页 > 其他分享 >Android MVVM之SavedStateHandle数据保存之详解与使用。

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

时间:2023-04-11 10:33:07浏览次数:42  
标签:set MVVM SavedStateHandle get 保存 state key Android out


一、介绍


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


二、分析

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

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

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集合进行单独处理


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

源码

 三、类的介绍

3.1 SavedStateRegistry.SavedStateProvider

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

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

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的规则。

标签:set,MVVM,SavedStateHandle,get,保存,state,key,Android,out
From: https://blog.51cto.com/u_16065093/6182721

相关文章

  • Android 短视频和图片无读写权限TargetApi>=29解决方案
    一、背景        目前很多公司在适配API29,也就是targetSdkVersion=29的权限适配。不仅是权限的适配,还有政策的要求。目前就有很多大公司已收到工信部要求,不给读写权限:android.permission.WRITE_EXTERNAL_STORAGE和android.permission.READ_EXTERNAL_STORAGE      ......
  • Android 代码混淆 包名被混淆 主工程二次混淆 一站解决你的混淆
    代码混淆(Obfuscatedcode)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。已经存在许多种功能各异的代码混淆器。将代码中的各种元素,如......
  • Android DataStore Proto框架存储接入AndroidStudio教程详解与使用
    一、介绍        通过前面的文字,我们已掌握了DataStore的存储,但是留下一个尾巴,那就是Proto的接入。Proto是什么?Protobuf,类似于json和xml,是一种序列化结构数据机制,可以用于数据通讯等场景,相对于xml而言更小,相对于json而言解析更快,支持多语言官网:LanguageGuide(proto3)|......
  • Android Jetpack组件之WorkManager高级概念介绍与使用(三)
    一、介绍        通过前面两篇,我们基本掌握了组件的workmanager的接入,以及api的使用等。但是一个框架如果运用在复杂的项目中,肯定需要有其他额外的支持,介绍来我们将会介绍高级概念,以及对前面的知识点进行回顾与拓展。高级概念一、配置和初始化        默认情况下,当......
  • Android Imageview 图片置灰,图片特殊节日去真彩色
    ImageViewImageView是Android中的一个图片显示控件,用来加载网络或者本地图片资源。好看的图片可以让应用更被用户接收,如果图片作为应用的装饰,已成为主流,但不是所有的图片显示都符合要求,比如一些特殊时间,特别靓丽的色彩不符合当下假日要求,这个时候如果能让图片变成灰色,这样用助于达......
  • Android 学习任务缩略图
    运行环境1、下面案例在系统签名下可以运行版本:Android112、注意:我尝试在没有系统签名下打开//代码中FilexmlFile=newFile("/data/system_ce/0/recent_tasks/33_task.xml");会报以下错误2023-04-1016:23:38.2784411-4438/com.example.myapplicationW/Sys......
  • Android开发中Dialog填充满父容器
    Android开发中Dialog填充满父容器在Android原生开发中,通常会使用自定义的Dailog来设计二级面板,其自带一个黑色透明的遮蔽效果。但是想要将Dialog填充满父容器,是需要一些尝试的。环境介绍自定义Dialog类,加载自定义布局layout并进行数据绑定,同时创建接口进行信息传递。其中布局......
  • Android开发_记事本(7)
    搜索实现搜索图标的添加main_menu<itemandroid:id="@+id/action_search"android:icon="?attr/menu_search"app:showAsAction="always"app:actionViewClass="androidx.appcompat.widget.SearchView"android:title......
  • Android开发_记事本(6)
    删除键的功能实现删除当前笔记文件EditActivity中添加@OverridepublicbooleanonOptionsItemSelected(MenuItemitem){//监听状态栏上内容被点击switch(item.getItemId()){caseR.id.delete:newAlertDialog.Builder(EditActivity.this)/......
  • Android开发_记事本(3)
    适配器NoteAdapter相当于数据和ListView之间的中介 packagecom.example.note; ​ importandroid.content.Context; importandroid.content.SharedPreferences; importandroid.preference.PreferenceManager; importandroid.text.TextUtils; importandroid.view.Vie......