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

12 | 实战:用Kotlin实现一个网络请求框架KtHttp

你好,我是朱涛,又到了实战环节。
在前面几节课当中,我们一起学习了 Kotlin 的委托、泛型、注解、反射这几个高级特性。那么今天这节课,我们将会运用这些特性,来写一个 Kotlin 版本的 HTTP 网络请求框架。由于它是纯 Kotlin 开发的,我们就把它叫做是 KtHttp 吧。
事实上,在 Java 和 Kotlin 领域,有许多出色的网络请求框架,比如 OkHttpRetrofitFuel。而我们今天要实现的 KtHttp,它的灵感来自于 Retrofit。之所以选择 Retrofit 作为借鉴的对象,是因为它的底层使用了大量的泛型、注解和反射的技术。如果你能跟着我一起用泛型、注解、反射来实现一个简单的网络请求框架,相信你对这几个知识点的认识也会更加透彻。
在这节课当中,我会带你从 0 开始实现这个网络请求框架。和往常一样,为了方便你理解,我们的代码会分为两个版本:
1.0 版本,我们会用 Java 思维,以最简单直白的方式来实现 KtHttp 的基础功能——同步式的 GET 网络请求;
2.0 版本,我们会用函数式思维来重构代码。
另外,在正式开始学习之前,我也建议你去 clone 我 GitHub 上面的 KtHttp 工程:https://github.com/chaxiu/KtHttp.git,然后用 IntelliJ 打开,并切换到 start 分支跟着课程一步步敲代码。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

作者朱涛以实战的方式介绍了使用Kotlin实现名为KtHttp的网络请求框架的过程。文章首先深入讲解了Kotlin的高级特性,包括委托、泛型、注解和反射,并展示了如何将这些特性应用到实际项目中。KtHttp的灵感来自于Retrofit,底层使用了大量的泛型、注解和反射技术。文章分为1.0版本和2.0版本,分别实现了基础功能和以函数式思维重构的KtHttp。读者可以通过跟着作者的教程,从0开始实现这个网络请求框架,并在GitHub上找到作者的KtHttp工程进行实践。本文的重点在于展示如何运用Kotlin的高级特性来实现一个网络请求框架,对于想要深入学习Kotlin并将其应用到实际项目中的读者来说,是一篇很有价值的实战教程。文章内容涉及到Kotlin的高级特性、网络请求框架的实现原理以及反射技术的运用,适合对Kotlin和网络请求感兴趣的读者阅读学习。在1.0版本中,作者灵活利用了动态代理、泛型、注解和反射等技术,实现了KtHttp的基础功能;而在2.0版本中,作者以函数式的思维重写了KtHttp的内部逻辑,大量地使用了Kotlin标准库里的高阶函数,进一步提升了代码的可读性。整篇文章通过实际案例展示了Kotlin在网络请求框架中的应用,对读者进行了深入而全面的技术分享。

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

全部留言(20)

  • 最新
  • 精选
  • 白乾涛
    勉强能看明白,但这代码谁能手写的出来呀? 就算写出来了,谁保证没 bug?谁能保证别人能看明白?谁能保证后续能维护?

    作者回复: 是的,这也取决于团队的默契程度。

    2022-02-19
    7
  • $Kotlin
    动图看起来不太方便,不能暂停,而且这个动图好长。

    作者回复: 后面的长动图我会改成视频形式哈。至于……这节课的动图,就辛苦你多看几遍啦。

    2022-01-24
    3
  • syz
    动态代理的那张动图,播放中不能暂停,要懂这样过一遍没毛病。建议将每一次停顿变成带序号的标注,贴代码上来感觉会好点。

    作者回复: 好的,感谢你的建议,后续课程中比较长的动图我都做成视频了,随时可以暂停的。

    2022-03-09
    2
  • 面无表情的生鱼片
    请教老师,如果 method.genericType 是 kotlin 的 Basic Type 的话(例如:String、Int),要怎么做兼容比较好呢?

    作者回复: 在工作中,有时候确实会遇到String类型的需求。要解决这个问题的话,我们只需要将JSON解析相关逻辑抽离出去,然后将逻辑交给业务层去实现即可。

    2022-02-12
    2
  • 木易杨
    Kotlin这语法越写越变态。Java啰嗦吧,起码能看懂,没那么多语法题

    作者回复: 别怕,适应了就好。另外,等到了源码篇,我也会集中分析一波Kotlin的高阶函数的原理和意义,请留意哈。

    2022-01-24
    2
  • 阿康
    Lambda 表达式当中的返回语法 能讲下吗?或者给个相关的博客连接

    作者回复: 其实很好理解: return@newProxyInstance代表返回Lambda;而直接的return,代表了返回create()这个函数。 参考链接:https://kotlinlang.org/docs/lambdas.html#underscore-for-unused-variables

    2022-01-24
    3
    2
  • 河山
    请问老师 像如下代码 fun <T> Int.toType():T{ return (this as T) } class Animal{} fun main() { println(100.toType<Animal>()) } 这个不应该有类型转换异常吗 为什么我运行没有报异常 而且会输出100 但是debug模式 去运行100.toType<Animal>() 这个表达式 却的确会提示类型转换异常 老师 为什么运行没问题啊

    作者回复: 如果你将上面的代码进行反编译就会发现问题了。其中主要的原因还是在于Kotlin的泛型是伪泛型。这里我们调用asT的时候,其实它只是做了一个object强转,所以并不会出问题。如果你将代码改成这样,就肯定会在运行时出现崩溃了: ``` fun <T> Int.toType():T{ return (this as T) } class Animal{ // 变化在这里 fun getName() = "Animal" } fun main() { println(100.toType<Animal>().getName()) } ```

    2022-03-09
    1
  • PoPlus
    操作符太多了,日常写业务不常用的话很快就忘了。不知道老师是如何知道这么多没听过的操作符(filterIsInstance、fold)🥲。

    作者回复: 其实还是靠练习,熟能生巧。我会在工作里尽量用上来,而在工作之余,我也会写点其他练手的代码,也会刷点算法题之类的。

    2022-02-27
    3
  • 山河入梦
    // 这种写法是有问题的,但这节课我们先不管。 我想问下老师,这种写法的问题在哪,因为我一直这样写来着,从昨天看了文章,就一直纠结着

    作者回复: 改进的方向是:我们应该尽可能消灭数据类的可空性(加餐四有提到)。具体来说,应该使用非空类型,具体怎么做,我会在后面的课程里提到哈。

    2022-02-16
  • jim
    kotlin确实很优雅,有时候写着写着看不懂了!

    作者回复: 确实,所以要多练习,多适应。

    2022-02-15
收起评论
显示
设置
留言
20
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部