请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

cancel后 调用 join 正确的现象应该是什么?

https://img1.sycdn.imooc.com//szimg/5fa0d949095be7d504450375.jpg

https://img1.sycdn.imooc.com//szimg/5fa0d949091f4f9206230116.jpg

这是书上最新的代码。打印了 end 。

job.cancel您不说把他所在的协程取消了么。也就是 suspend mian这个协程取消了。为啥还会打印 end?


============================update=====================

图一

https://img1.sycdn.imooc.com//szimg/5fa2ac95098de25510380642.jpg

图二

https://img1.sycdn.imooc.com//szimg/5fa2acb6097146cd10980774.jpg


正在回答

2回答

打断点,导致delay的2000时间到了吧,所以协程都执行完了还取消个啥

0 回复 有任何疑惑可以回复我~
bennyhuo 2020-11-03 18:52:06

cancel的是job,job是launch启动的那个协程,并非suspend main函数的协程。这个我在视频和书里面都有特意强调,可以留意下

0 回复 有任何疑惑可以回复我~
  • 提问者 慕前端9039556 #1
    我看了一下书,书上写的是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应该不会被打印才对呀?
    回复 有任何疑惑可以回复我~ 2020-11-03 23:49:51
  • bennyhuo 回复 提问者 慕前端9039556 #2
    你还是没区分清楚  job.join调用所在的协程和job自己。
    
    job被取消了,但job所在的协程有没有被取消。
    回复 有任何疑惑可以回复我~ 2020-11-04 09:22:54
  • 提问者 慕前端9039556 回复 bennyhuo #3
    我发现一个问题,他可能导致了我的理解上跟你出现了歧义。我1楼上传了两张图片。这个现象是bug吗?我真不理解为啥会直接两次状态流转。。。
    回复 有任何疑惑可以回复我~ 2020-11-04 16:12:57
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信