Android-开发笔记-coroutines
概念
协程是一种并发设计模式,并基于其他语言的既定概念。在Android上,协程可帮助解决两个主要问题:
- 管理长时间运行的任务
- 提供main-safety,或从主线程安全地调用网络或磁盘操作。
suspend fun fetchDocs() { // Dispatchers.Main |
Dispatchers
为了指定协程应该在哪里运行,Kotlin提供了三个可以使用的Dispatchers
Dispatchers.Main | Dispatchers.IO | Dispatchers.Default |
---|---|---|
Main thread on Android, interact with the UI and perform light work | Optimized for disk and network IO, off the main thread | Optimized for CPU intensive work, off the main thread |
Calling suspend functions, Call UI functions, Updating LiveData | Database*, Reading/writing files, Networking** | Sorting a list, Parsing JSON, DiffUtils |
coroutines VS RxJava
一个处理请求的例子//RxJava
interface SampleService {
@GET("/users")
fun getTopUsers(): Deferred<List<User>>
}
fun load() {
disposable +=
service.getTopUsers()
.subscribeOn(io())
.observeOn(mainThread())
.subscribe(
//
)
}
//coroutines
interface SampleService {
@GET("/users")
suspend fun getTopUsers(): List<User>
}
fun load() {
viewModelScope.launch {
try {
val users = service.getTopUsers()
//
} catch (e: Exception) {}
}
}
从代码风格来看coroutines的写法更加简洁更像是同步的有点像javascript的async/await味道。
有以下两种方式之一启动协程:
- launch启动一个新的协程,并且不会将结果返回给调用方。 可以使用发布启动任何被认为是“即发即弃”的工作。
- async启动一个新的协程,并允许使用await的suspend函数返回结果。
ViewModel包含了内置的viewModelScope。这提供了一种在ViewModel范围内启动协程的标准方法,如上代码。