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 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flow -> 正文阅读

[移动开发]Flow

介绍:Flow是google官方提供的一套基于kotlin协程的数据流处理模型,类似RxJava。另外Flow作用在协程内,可以与协程的生命周期绑定,当协程取消时,Flow也会被取消,避免了内存泄漏风险,这点又类似LiveData。因此Flow可以用来替代LiveData和RxJava
LiveData不支持线程切换,数据更新都是在主线程完成,对于频繁切换线程处理比较麻烦。
RxRava操作符较多,入门门槛较高,另外未关联生命周期,需要自己处理取消订阅。
使用:
1、创建flow

//方式1
val flowOne = flow {
   for (i in 1..5) {
       emit(i)
   }
}

//方式2
val flowTwo = flowOf(1..5)

//方式3
val flowThree = (1..5).asFlow()

//方式4
val flowFour = channelFlow  {
   for (i in 1..5) {
       send(i)
   }
}

注:方式2、3指定了数据类型,而方式1、4为指定类型可以发送不同类型的数据。

2、执行flow

CoroutineScope(Dispatchers.Main).launch {
    flow {
        for (i in 1..2) {
            Log.e("aa", "emit $i start")
            delay(2000)
            emit(i)
            Log.e("aa", "emit $i end")
        }
        emit("巴拉巴拉!")
    }.onStart {
        Log.e("aa", "onStart")
    }.onCompletion {
        Log.e("aa", "onCompletion")
    }.collect {
        //接收数据流
        Log.e("aa", "collect $it start")
        delay(2000)
        Log.e("aa", "collect $it end")
    }
}

注:

(1)collect要在协程中调用或者把方法用suspend声明为挂起函数

(2)当调用collect时才执行数据流,每个订阅者都完整的执行flow流

(3)flow和collect交叉执行。flow中执行到emit时跳转到collect中执行,collect执行完又回到flow

3、flowOn操作符:指定flow执行环境,不指定默认和collect一致

.flowOn(Dispatchers.IO)

注:

(1)flowOf(requestData()),其中requestData()运行环境与flowOn指定的环境无关,flowOn作用域为flow{}中的代码。

(2)flow{}中不允许通过withContext(Dispatchers.Default) 切换环境需要flowOn方式

4、zip操作符:进行两个流的数据压缩

 val flowOne = flow {
     for (i in 5..10) {
        Log.e("aa", "emit $i start")
        emit(i)
        Log.e("aa", "emit $i end")
     }
 }

....
.zip(flowOne){t1, t2 ->
     "t1=$t1  t2=$t2"
}.collect {
     //接收数据流
     Log.e("aa", "collect $it start")
     delay(2000)
     Log.e("aa", "collect $it end")
}

注:

(1)flow和collect并不像上面那样规律的顺序交叉执行

(2)两个flow中emit的数量不同时,依据最小的执行完为止

5、冷流vs热流(以上创建方式均为冷流,下面介绍热流)

冷流:当订阅时才执行,且每次订阅上游都会完整的执行数据流,相当于每个订阅的事件都是独立的
热流:不管是否被订阅,上游发布都会执行数据流,多个订阅者都能收到相同的消息,相当于将处理结果广播给所有订阅者。

6、SharedFlow

7、StateFlow

参考:
“再见RxJava,你好Flow”,Android线程切换哪家最强?
Android Kotlin之Flow数据流 ?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-13 11:51:34  更:2022-05-13 11:52:29 
 
开发: 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/25 1:23:29-

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