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
《朱涛 · Kotlin 编程第一课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(8)
- 最新
- 精选
- PoPlus网络请求是一次性事件,我都改用 Flow 的话合适吗?
作者回复: 这一点其实就仁者见仁智者见智了,因为单一数据也可以看做是数据流的特殊情况。
2022-03-145 - 魏全运awaitClose感觉有等待协程执行结束的作用,等待老师的专业解答
作者回复: 其实你的方向已经对了,你能想到更多的信息吗?
2022-03-1621 - 白泽丶是不是和 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是强制性的,以防止取消流量收集时发生内存泄漏,否则即使流量收集器已经完成,回调也可能继续运行。为避免此类泄漏,如果块返回但通道尚未关闭,此方法将抛出IllegalStateException2023-04-28归属地:四川1
- 彭Kai.挂起当前的协程,好让flow里的代码执行,要不然不会执行2022-10-10归属地:北京
- 郑峰awaitClose内部实现是suspendCancellableCoroutine。 所以它可以支持结构化的取消,比如从parent job来的取消请求。2022-08-20归属地:美国
收起评论