Timeout(超时) Structured concurrency(结构化并发) Channels(信道) Flow(异步流) Coroutine(协程) 为了避免在主线程中执行过多任务导致 UI 反应迟钝,不可避免的必须使用多线程。 但由于多线程耗费太多资源,Kotlin 语言引入了协程以替代线程。 Kotlin 语言中的协程可以被想象成一种轻量级的线程。可以轻易开启百万级别的...
Flow是一种冷流,只有在收集时才会开始执行,Flow的收集是懒加载的。 Flow的创建和操作符的调用并不需要挂起函数。 Flow的创建可以使用flowOf、asFlow、channelFlow等函数。 Flow的收集可以使用collect函数,collect函数是一个挂起函数,只能在协程中调用。因为收集Flow可能涉及到耗时的操作,例如网络请求或者磁盘读写,所以需...
runBlocking {valflow = flow {for(iin1..3) { delay(1000) emit(i) } }valtime = measureTimeMillis { flow.buffer(50)//指定缓存区大小为50个.collect { delay(3000) println("$it") } } println("time :$timems") } } 结果: 1 2 3 time : 10158 ms 时间是1s + 3s * 3 2.指定上流...
如果在这基础上你还需要Flow重发数据,那就选择SharedFlow。如果你只需要重发最新的数据,也可以选择StateFlow,但需要注意StateFlow不会发送重复的数据。 所以针对这个原则,我们就可以解决第二个问题,在什么地方使用Flow比较合适,或者说比较容易上手呢?那就是Repository层。因为通常我们需要在Repository层获取网络数据或者获取...
Flow 是 Kotlin 官方基于协程构建的用于响应式编程的API。响应式编程简单来说就是使用异步数据流进行编程 。协程中,使用挂起函数仅可以异步返回单个值,而 Flow 则可以异步返回多个值,并补全kotlin语言中响应式编程的空白。 比如压缩图片需要执行多个异步任务,完成一个通知一下,不借助 Kotlin Flow,我们可能会使用线程池...
假如有这么一个场景:一开始有一个冷流 coldFlow 和它对应的消费者,后来下游又有几个新来的消费者需要使用这个 coldFlow,并且还需要之前已发送过的数据。而冷流的生产者与消费者是一对一的关系,且没有replay缓存机制,为新的消费者再创建一个冷流开销较大,这种情况下将冷流转为热流就显得事半功倍了。
onStart 1 onCompletion Timeout 暂时只能用 try-catch 做超时处理。 Flow 执行时间 funmain(){runBlocking{valstartTime=System.currentTimeMillis()flow{for(iin1..5){delay(100)println("emit:$i")emit(i)}}.collect{delay(100)println("collect:$it")}println("Cost:${System.currentTimeMillis()-start...
直到我打开Android 架构组件页面,看了在页面上增加了最新的文章,这几篇文章大概的内容是说如何在 MVVM 中使用 Flow 以及如何与 LiveData 一起使用,当我看完并通过实践之后大概明白了,LiveData 是一个生命周期感知组件,它并不属于 Repositories 或者 DataSource 层,下文会有详细的分析。
首先可以直观地感受到,使用 Flow 去处理这一逻辑较为简单,代码量较少,这也是 Flow 的魅力所在。我们按顺序介绍一下所使用到的 Flow 操作符: debounce 操作符 具体的操作符方法声明: // code 9 public fun <T> Flow<T>.debounce(timeoutMillis: Long): Flow<T> 用于过滤掉最新的发射值之前 timeoutMillis...
使用withTimeoutOrNull方式取消: suspendfunsimpleFlow()=flow<Int>{for(iin1..3){delay(1000)emit(i)// 发射,产生一个元素}}.flowOn(Dispatchers.Default)funmain(){runBlocking{withTimeoutOrNull(2000){// Flow构建方式1simpleFlow().collect{value->println(value)}// 收集元素}withTimeoutOrNull(2000...