安卓 协程2

1、Kotlin 协程(线程)切换
在协程中使用 launch、async、Channel 和 Flow
4、withContext、runBlocking、launch、async 操作符
withContext 允许你在后台线程执行一些工作,然后切换到主线程执行UI操作,并最终返回操作的结果。

import kotlinx.coroutines.Dispatchers 
import kotlinx.coroutines.launch 
import kotlinx.coroutines.runBlocking 
import kotlinx.coroutines.withContext 
fun main() = runBlocking { 
    launch(Dispatchers.Default) { 
        // 在后台线程执行一些工作 
        val result =  withContext(Dispatchers.Main) { 
            // 切回主线程执行UI操作 
            // 返回操作的结果 "Operation Result" 
        } 
        println("Result: $result") 
    } 
} 

join()、await()非阻塞式等待,直到线程结束,而不会将当前线程挂起。

runBlocking:会阻塞当前线程,直到所有在 runBlocking 内部启动的协程都完成。注意,它不会执行上下文切换,而是在当前线程上运行协程。

launch 、async启动时,必须要有协程范围,而runBlocking却不需要,其实runBlocking 也提供了一个协程作用域,但是它的使用方式和其他两个不同,因为它直接阻塞了当前线程。
launch:用于在指定的上下文中启动协程,它会返回一个 Job 对象,允许你管理协程的生命周期。通常与 async 或 withContext 结合使用。
async: 用于执行异步操作,它返回一个 Deferred 对象,其实也是一个job,可以用于获取操作的结果。与 await 结合使用以等待结果。可以在不同的上下文中使用它,以便执行异步操作后切换回主线程。多个async依次执行,用await()等待。
await:用于等待 Deferred 对象的结果。通常与 async 一起使用。

withContext 与launch 区别:
launch :启动一个新的协程,并立即返回 Job 对象,它并不会等待协程体完成。
withContext :挂起当前协程,并在指定上下文中执行代码块,等待代码块执行完成后继续执行。

supervisorScope:用于创建一个协程作用域,其中的协程是独立的,不会因为一个子协程的失败而取消其他子协程。这在处理并发任务时很有用。
coroutineScope:用于创建一个协程作用域,其中的所有子协程必须执行完成后,它才会执行完成。它也适用于并发任务,但要求所有子协程都成功执行。
2、Channel和Flow都是Kotlin协程库中的重要组件,用于处理数据流,但它们有不同的用途和特性。

Channel与Flow的共同点
异步通信:Channel和Flow都支持异步通信,允许协程之间以非阻塞的方式传递数据。
线程安全:它们在内部都实现了线程安全的数据访问机制,确保数据在多个协程之间传递时的正确性。
协程支持:它们都是Kotlin协程库的一部分,充分利用了协程的强大功能来简化异步编程。

Channel与Flow的区别
Channel: 类似于热流(Hot Stream),即使没有收集器,也会持续发送数据。
Flow: 类似于冷流(Cold Stream),只有在有收集器订阅时才会开始发射数据。
使用场景:
Channel是一个双向通道,允许同时有多个生产者和消费者。你可以通过send方法发送数据,通过receive方法接收数据。适用于复杂的并发场景,特别是在需要双向通信或多生产者多消费者的情况下。
Flow 更适合于简单的单向数据流传递,你可以通过emit方法发送数据,通过collect方法接收数据。特别是当只需要从一个源头获取数据时。主要用于单向的数据流传递,通常只有一个生产者,可以有多个收集器(消费者)。Flow更类似于RxJava的Observable或LiveData。
数据消费:
Channel中的数据可以被多个消费者消费,但每个数据项只能被消费一次;互斥的。
而Flow数据流可以被多个收集器收集,每个收集器会独立地接收到相同的数据流副本。
主要用于单向的数据流传递。
冷流 vs 热流:
Cold Flow: 只有在有收集器订阅时才会开始发射数据。每次收集都会重新启动数据流的生成过程。
Hot Flow: 即使没有收集器订阅,也会持续发送数据。共享同一个数据源,所有收集器会接收到相同的数据。
3、StateFlow和 SharedFlow是热流,在垃圾回收之前,都是存在内存之中,并且处于活跃状态的。
StateFlow是一个状态容器式可观察数据流可以向其收集器发出当前状态更新和新状态更新。还可通过其value属性读取当前状态值。
和livedata及其相似。
SharedFlow会向从其中收集值的所有使用方发出数据。有点类似BroadcastChannel,接收端都是可以收到消息的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容