android-如何安排Kotlin协程
最近,我一直在阅读很多文章,并观看了很多关于Kotlin协同例程的视频,尽管我付出了很多努力,但我仍然无法理解它们.
我想我终于找到了一种方法来说明我的问题:
class MyViewModel() : CoroutineScope { override val coroutineContext = Dispatchers.Main + Job() fun foo() = launch(handler) { Log.e("test","A") } } class MainActivity : Activity() { override fun onCreate() { MainViewModel().foo() Log.e("test","B") } }
输出为:
E/test: B E/test: A
而且我不知道怎么回事,我只使用一个线程(主线程).如果我的代码按顺序执行,那么到我到达log(B)…行时,log(A)应该已经被打印了.
协程库是否在内部使用其他线程来完成此任务?这是我能提出的唯一解释,但在文档中没有找到任何说明.
PS:很抱歉将android混入其中,但是此代码:
fun main() { GlobalScope.launch(Dispatchers.Unconfined) { // launch new coroutine in background and continue print(Thread.currentThread().name + "World!") // print after delay } (0 .. 1000).forEach { print(".") } }
似乎按预期工作并打印:
main @ coroutine#1World!………………………………
因为1个线程==顺序工作
希望我的问题有意义,感谢您的阅读!
您可以在this article中找到更多信息.
由OP编辑(在阅读本文之前,请先阅读以上文章):
只是想弄清楚为什么上面的android示例可以正常工作,以防万一有人还在想.
fun main() { GlobalScope.launch(Dispatchers.Unconfined) { // launch new coroutine in background and continue print(Thread.currentThread().name + "World!") // print after delay } (0 .. 1000).forEach { print(".") } }
我们将GlobalScope设置为使用UNCONFINED调度程序,并且此调度程序的isDispatchNeeded设置为false.
false表示“当前线程中的计划”,这就是为什么我们看到日志按顺序打印的原因. UNCONFINED不应在常规代码中使用.
所有其他调度程序都将isDispatchNeeded设置为true,即使UI调度程序也是如此.查看:https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-coroutine-dispatcher/is-dispatch-needed.html
(顺便说一句,如果我们未指定,GlobalScope将使用默认调度程序)
以上是来客网为你收集整理的android-如何安排Kotlin协程 全部内容,希望文章能够帮你解决android-如何安排Kotlin协程 所遇到的程序开发问题。
如果觉得来客网网站内容还不错,欢迎将来客网网站推荐给程序员好友。