IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> LiveData还没普及就Out了?瞧瞧Flow吧 -> 正文阅读

[移动开发]LiveData还没普及就Out了?瞧瞧Flow吧

Flow是Google官方提供的一个类似于RxJava的响应式编程模型。它是基于Kotlin协程的。 它相对于Rxjava具有以下特点:

  1. 具有更友好的API,学习成本较低。
  2. 结合协程的作用域,当协程被取消时,Flow也会被取消,避免内存泄漏。

LiveData的不足

LiveData只能在主线程更新数据,虽然提供了postValue用于后台线程,但其实postValue也是需要切换到到主线程的,这意味着当我们想要更新LiveData对象时,我们会经常更改线程,如果在修改LiveData后又要切换回到工作线程那就更麻烦了,同时postValue可能会有数据丢失的问题。

postValue只是把传进来的数据先存到一个变量中,然后往主线程抛一个Runnable,在这个Runnable里面再调用setValue来把存起来的值设置上去,并回调观察者们。而如果在这个Runnable执行前多次 postValue,其实只是改变这个变量的值,并不会再次抛另一个Runnable,这就会出现值覆盖的问题,从而造成数据丢失。

冷流和热流

冷流:只有订阅者订阅时,才开始执行发射数据流的代码。并且冷流和订阅者只能是一对一的关系,当有多个不同的订阅者时,消息是重新完整发送的。
热流:无论有没有订阅者订阅,事件始终都会发生。当热流有多个订阅者时,热流与订阅者们的关系是一对多的关系,可以与多个订阅者共享信息。

首先,贴上引用

    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0'
    implementation "androidx.activity:activity-ktx:1.3.1"
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-beta01"

SharedFlow的使用

在ViewModel中发送数据

class MainViewModel : ViewModel() {
    val sharedFlow = MutableSharedFlow<String>()

    init {
        viewModelScope.launch {
            sharedFlow.emit("Hello")
            sharedFlow.emit("Uncle Xing")
        }
    }
}

在Activity中接收数据

        val mainViewModel: MainViewModel by viewModels()
        lifecycleScope.launch {
            mainViewModel.sharedFlow.collect {
                Log.i(tag, "value:$it")
            }
        }

将冷流转化为SharedFlow

    val coldFlow = flow {
        for (i in 1..3) {
            delay(1000)
            emit(i)
        }
    }.shareIn(viewModelScope, WhileSubscribed(1000), 1)

shareIn有三个参数:

  1. scope:共享开始时所在的协程作用域范围。
  2. started:控制共享的开始和结束的策略,此参数有三个值,Lazily:当首个订阅者出现时开始,在scope指定的作用域被结束时终止;Eagerly:立即开始,在scope指定的作用域被结束时终止;WhileSubscribed:在没有收集器的情况下取消上游数据流。
  3. replay:状态流的重播个数。

Whilesubscribed

WhileSubscribed策略会在没有收集器的情况下取消上游数据流,他支持两个参数:

        public fun WhileSubscribed(
            stopTimeoutMillis: Long = 0,
            replayExpirationMillis: Long = Long.MAX_VALUE
        ): SharingStarted =
            StartedWhileSubscribed(stopTimeoutMillis, replayExpirationMillis)
    }
  1. stopTimeoutMillis:指最后一个订阅者结束订阅与停止上游流的时间差,单位是毫秒,默认值是0,即立刻停止。有时可能并不想因为视图有几秒钟不再监听就结束上游流,比如当用户旋转设备时,原来的视图会先被销毁,然后数秒钟内重建。
  2. replayExpirationMillis:表示数据重播的过时时间,如果用户离开应用太久,此时您不想让用户看到陈旧的数据,你可以用到这个参数。

StateFlow使用

StateFlow继承于SharedFlow,是SharedFlow的一个特殊变种,StateFlow与LiveData比较相近,所以可以替换LiveData。

class MainViewModel : ViewModel() {
    var count = 1
    val valueFlow = MutableStateFlow(count)
    fun changeValue() {
        count++
        valueFlow.value = count
    }
}

在ViewModel上游不断发送值,View层通过collect函数去获取到上游发送的数据。StateFlow只有在值改变时才会返回,如果发生更新但值没有变化时,StateFlow不会回调collect函数,这也是跟SharedFlow的主要区别,SharedFlow支持发出和收集重复值。

        val mainViewModel: MainViewModel by viewModels()

        lifecycleScope.launchWhenCreated {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                mainViewModel.valueFlow.collect {
                    Log.i(tag, "value:$it")
                }
            }
        }

观察StateFlow需在协程中,因此我们需要协程构建器:

  1. lifecycleScope.launch : 立即启动协程,并且在本 Activity或Fragment 销毁时结束协程。
  2. LaunchWhenStarted和LaunchWhenResumed:在lifecycleOwner进入X状态之前一直等待,又在离开X状态时挂起协程。

官方推荐用repeatOnLifecycle来构建协程,当视图处于 STARTED 状态时会开始收集流,并且在 RESUMED 状态时保持收集,最终在视图进入 STOPPED 状态时结束收集过程。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 14:12:28  更:2021-09-27 14:14:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:42:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码