朱涛 · Kotlin 编程第一课
朱涛
Google 认证的 Kotlin、Android 开发者专家,博客“Kotlin Jetpack 实战”作者
6717 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
朱涛 · Kotlin 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

24 | 实战:让KtHttp支持Flow

你好,我是朱涛。又到了熟悉的实战环节,这一次我们接着来改造 KtHttp,让它能够支持协程的 Flow API。
有了前面两次实战的基础,这次我们应该就轻车熟路了。在之前的4.0 版本中,为了让 KtHttp 支持挂起函数,我们有两种思路,一种是改造内部,另一种是扩展外部。同理,为了让 KtHttp 支持 Flow,这次的实战也是这两种思路。
因此,这节课我们仍然会分为两个版本。
5.0 版本,基于 4.0 版本的代码,从 KtHttp 的外部扩展出 Flow 的能力。
6.0 版本,修改 KtHttp 内部,让它支持 Flow API。
其实在实际的工作中,我们往往没有权限修改第三方提供的 SDK,那么这时候,如果想要让 SDK 获得 Flow 的能力,我们就只能借助 Kotlin 的扩展函数,为它扩展出 Flow 的能力。而对于工程内部的代码,我们希望某个功能模块获得 Flow 的能力,就可以直接修改它的源代码,让它直接支持 Flow。
那么在这节课里,我会同时用这两种手段来扩展并改造 KtHttp,为你演示其中的关键步骤。在这个过程中,我也会为你讲解其中的常见误区和陷阱,这样一来,你就可以放心地将 Flow 应用到你的实际工作中了。
OK,让我们正式开始吧!

5.0 版本:Callback 转 Flow

确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

KtHttp 6.0版本的开发为协程的Flow API提供了内部支持,使得KtHttp能够直接与Flow API进行交互。该版本通过修改内部实现,实现了对Flow API的支持,并讲解了常见误区和陷阱。文章还介绍了Callback转Flow的使用细节,包括使用callbackFlow将Callback转为Flow,优化空间,以及close()与close(throwable)的差异。此外,文章还探讨了callbackFlow内部启动其他协程任务时的取消情况。通过本文的介绍,读者可以了解到KtHttp 6.0版本的新特性,以及如何利用callbackFlow将第三方SDK的Callback扩展成Flow,为读者提供了技术上的启发和指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《朱涛 · Kotlin 编程第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • PoPlus
    网络请求是一次性事件,我都改用 Flow 的话合适吗?

    作者回复: 这一点其实就仁者见仁智者见智了,因为单一数据也可以看做是数据流的特殊情况。

    2022-03-14
    5
  • 魏全运
    awaitClose感觉有等待协程执行结束的作用,等待老师的专业解答

    作者回复: 其实你的方向已经对了,你能想到更多的信息吗?

    2022-03-16
    2
    1
  • 白泽丶
    是不是和 delay() 一样,在外部取消时抛出 CancellationException 异常并从而让协程退出呢

    作者回复: 嗯,比较接近了~

    2022-04-12
  • 魏全运
    去掉awaitClose后程序有异常了。 java.lang.IllegalStateException: 'awaitClose { yourCallbackOrListener.cancel() }' should be used in the end of callbackFlow block. Otherwise, a callback/listener may leak in case of external cancellation. See callbackFlow API documentation for the details. 原因还不清楚。。。

    作者回复: 你能从报错信息里找到更多信息吗?

    2022-03-16
  • 魏全运
    为什么第5版中的程序要等一会儿才会退出呢?

    作者回复: 因为,我们的主线程要等待OkHttp底层的线程池停下来。

    2022-03-16
  • 漱口杯
    注释调awaitClose可能会发生内存泄漏,官方文档里是这样写的: 使用awaitClose是强制性的,以防止取消流量收集时发生内存泄漏,否则即使流量收集器已经完成,回调也可能继续运行。为避免此类泄漏,如果块返回但通道尚未关闭,此方法将抛出IllegalStateException
    2023-04-28归属地:四川
    1
  • 彭Kai.
    挂起当前的协程,好让flow里的代码执行,要不然不会执行
    2022-10-10归属地:北京
  • 郑峰
    awaitClose内部实现是suspendCancellableCoroutine。 所以它可以支持结构化的取消,比如从parent job来的取消请求。
    2022-08-20归属地:美国
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部