• 迩、卜懂莪
    2022-03-15
    Kthttp系列实战 像是简易版的retrofit2 对学习 retrofit的源码有很大帮助

    作者回复: 是的,Retrofit2也是练手的绝佳案例。

    
    4
  • 神秘嘉Bin
    2022-03-02
    思考题: (1)执行async可认为一瞬间就到了suspendCancellableCoroutine的await扩展方法,即协程被挂起。 (2)执行deferred.cancel(),可以使得挂起函数立刻返回并抛出协程cancel异常 (3)协程取消了,但网络请求还是发出去了,(因为网络请求有自己的线程)也会回来,调用continuation.resume,发现协程被取消了,抛出协程已经被取消的异常 (4.1)网络IO比deferred.await()早,那么deferred.await()会拿到异常,并catch (4.2)网络IO比deferred.await()晚,那么deferred.await()会立刻返回,没有异常 以上都是我猜的,没有实际运行 -.-

    作者回复: 分析很好。其实,能够直接分析出协程代码的执行流程,并且说出具体的原因,这也是很重要的一种能力。

    共 3 条评论
    3
  • 荒原
    2022-05-21
    KtHttpV3.invoke()方法返回值这样写会将同步请求的返回值转成了一个异步的KtCall return if (isKtCallReturn(method)){ KtCall<T>( client.newCall(request), gson, getTypeArgument(method) ) }else{ val response = client.newCall(request).execute() //这里转成了一个KtCall对象 gson.fromJson( response.body?.string(), method.genericReturnType ) } 而这样写就不会 if (isKtCallReturn(method)){ return KtCall<T>( client.newCall(request), gson, getTypeArgument(method) ) }else{ val response = client.newCall(request).execute() return gson.fromJson( response.body?.string(), method.genericReturnType ) } 这是为什么呢

    作者回复: 请问你这里同步、异步的判断依据是什么呢?说实话,我没看出来以上两段代码区别在哪里,只是换了return 的位置,理论上不应该影响逻辑的。你能提供一些具体的信息吗?

    
    1
  • 王安泽
    2022-04-14
    请问为什么Async的写法response返回后程序没有结束呢?

    作者回复: 没有立即结束,是因为Async底层使用的线程池没有立即回收,需要等一小会才会结束。

    
    1
  • better
    2022-02-24
    第一,它可以避免不必要的挂起,提升运行效率 ;请问老师,这一条指的是? 思考题: 网络请求还是会执行,第一点避免了,但是二点没有避免。

    作者回复: 是的。

    
    1
  • Allen
    2022-02-23
    问题二:像 suspendCoroutine 这一类系统所提供的挂起函数底层到底实现了什么,才使得其具有挂起的功能?是内部自己实现了 Callback 吗?为啥我们自己实现的 suspend 函数必须调用系统提供的挂起函数才能生效?

    作者回复: 这个问题有点深,在这里说不清,等到源码篇以后,你自己就懂啦~

    
    1
  • Allen
    2022-02-23
    涛哥,问两个问题哈。如果上面例子中的网络请求是运行在当前线程,是不是这里的挂起实际上也没有什么用,因为其还是会阻塞当前线程(像下面的代码一样)? suspend fun testSuspendFunc() { suspendCancellableCoroutine<Unit> { // stimulate the network request Thread.sleep(5000) it.resumeWith(Result.success(Unit)) } }

    作者回复: 是的。

    
    
  • Allen
    2022-02-23
    思考题的执行结果和 suspendCoroutine 的执行结果是一样的。取消了监听 invokeOnCancellation 的方法后,suspendCancellableoroutine 和 suspendCoroutine 本质上是一回事。

    作者回复: 你实际运行然后仔细对比看看,是不是一点差别都没有?

    共 3 条评论
    
  • 常正午
    2023-03-06 来自上海
    和retrofit2 源码相比,文章的代码质量差太远,还不如自己直接学习retrofit2如何支持suspend
    
    
  • 梦佳
    2022-12-06 来自北京
    已经用起来了
    
    