采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
这是书上最新的代码。打印了 end 。
job.cancel您不说把他所在的协程取消了么。也就是 suspend mian这个协程取消了。为啥还会打印 end?
============================update=====================
图一
图二
打断点,导致delay的2000时间到了吧,所以协程都执行完了还取消个啥
cancel的是job,job是launch启动的那个协程,并非suspend main函数的协程。这个我在视频和书里面都有特意强调,可以留意下
我看了一下书,书上写的是job.cancel后 join也要响应取消事件,进而把注册的回调移除了 【 continuation.invokeOnCancel { disposable.dispose() }】 完整代码: private suspend fun joinSuspend() = suspendCancellableCoroutine<Unit> { continuation -> val disposable = doOnCompleted { result -> continuation.resume(Unit) } continuation.invokeOnCancel { disposable.dispose() } } 所以根据下面的代码分析可知continuation.resume(Unit)不会执行。 所以Suspend main 函数这个状态机不会被resume。进而 最后的end应该不会被打印才对呀?
你还是没区分清楚 job.join调用所在的协程和job自己。 job被取消了,但job所在的协程有没有被取消。
我发现一个问题,他可能导致了我的理解上跟你出现了歧义。我1楼上传了两张图片。这个现象是bug吗?我真不理解为啥会直接两次状态流转。。。
登录后可查看更多问答,登录/注册
如果有一门语言可以取代Java,那么它一定是Kotlin。
1.5k 4
1.5k 1
367 1
157 20
1.3k 16