我很习惯使用 RX 来处理并发,但是,在我目前的工作中,我们混合使用了 AsyncTask、Executors + Handlers、Threads 和一些 LiveData。现在我们正在考虑转向使用 Kotlin Coroutines(事实上已经开始在代码库的某些地方使用它)。
因此,我需要开始关注协程,最好是利用我现有的并发工具知识来加快进程。
我曾尝试为他们关注 Google 代码实验室,虽然它让我有所了解,但它也提出了许多悬而未决的问题,因此我尝试通过编写一些代码、调试和查看日志输出来弄脏我的手。
据我了解,协程由 2 个主要构建块组成;挂起函数是你工作的地方,协程上下文是你执行挂起函数的地方,这样你就可以处理协同程序将在哪些调度程序上运行。
下面我有一些代码,它的行为符合我的预期。我已经使用 Dispatchers.Main 设置了一个协程上下文。因此,正如预期的那样,当我启动协程时,由于以下原因,getResources它最终会阻塞 UI 线程 5 秒Thread.sleep(5000):
private const val TAG = "Coroutines"
class MainActivity : AppCompatActivity(), CoroutineScope {
override val coroutineContext: CoroutineContext = Job() + Dispatchers.Main
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
log("onCreate", "launching coroutine")
launch {
val resource = getResource()
log("onCreate", "resource fetched: $resource")
findViewById<TextView>(R.id.textView).text = resource.toString()
}
log("onCreate", "coroutine launched")
}
private suspend fun getResource() …Run Code Online (Sandbox Code Playgroud)