破解 Kotlin 协程 - 入门篇

本文旨在帮助对协程不熟悉的读者理解Kotlin协程的基本概念和用法。通过从传统的回调例子出发,展示了如何将常规的网络请求改造成使用协程,介绍了CallAdapter和suspend函数两种改造方式。文章强调了协程在解决回调问题、简化异步代码和线程管理方面的优势,并简要解释了协程的本质和并发特性。
摘要由CSDN通过智能技术生成

假定你对协程(Coroutine)一点儿都不了解。 通过阅读本文看看是否能让你明白协程是怎么一回事。

640?wx_fmt=jpeg

1. 引子

我之前写过一些协程的文章,很久以前了。那会儿还是很痛苦的,毕竟 kotlinx.coroutines 这样强大的框架还在襁褓当中,于是乎我写的几篇协程的文章几乎就是在告诉大家如何写这样一个框架——那种感觉简直糟糕透了,因为没有几个人会有这样的需求。

这次准备从协程用户(也就是程序员你我他啦)的角度来写一下,希望对大家能有帮助。

2. 需求确认

在开始讲解协程之前,我们需要先确认几件事儿:

  1. 你用过线程对吧?

  2. 你写过回调对吧?

  3. 你用过 RxJava 类似的框架吗?

看下你的答案:

  • 如果上面的问题的回答都是 “Yes”,那么太好了,这篇文章非常适合你,因为你已经意识到回调有多么可怕,并且找到了解决方案;

  • 如果前两个是 “Yes”,没问题,至少你已经开始用回调了,你是协程潜在的用户;

  • 如果只有第一个是 “Yes”,那么,可能你刚刚开始学习线程,那你还是先打好基础再来吧~

3. 一个常规例子

我们通过 Retrofit 发送一个网络请求,其中接口如下:

 
  1. interface GitHubServiceApi {

  2. @GET("users/{login}")

  3. fun getUser(@Path("login") login: String): Call<User>

  4. }

  5.  

  6. data class User(val id: String, val name: String, val url: String)

Retrofit 初始化如下:

 
  1. val gitHubServiceApi by lazy {

  2. val retrofit = retrofit2.Retrofit.Builder()

  3. .baseUrl("https://api.github.com")

  4. .addConverterFactory(GsonConverterFactory.create())

  5. .build()

  6.  

  7. retrofit.create(GitHubServiceApi::class.java)

  8. }

那么我们请求网络时:

 
  1. gitHubServiceApi.getUser("bennyhuo").enqueue(object : Callback<User> {

  2. override fun onFailure(call: Call<User>, t: Throwable) {

  3. handler.post { showError(t) }

  4. }

  5.  

  6. override fun onResponse(call: Call<User>, response: Response<User>) {

  7. handler.post { response.body()?.let(::showUser) ?: showError(NullPointerException()) }

  8. }

  9. })

请求结果回来之后,我们切换线程到 UI 线程来展示结果。这类代码大量存在于我们的逻辑当中,它有什么问题呢?

  • 通过 Lambda 表达式,我们让线程切换变得不是那么明显,但它仍然存在,一旦开发者出现遗漏,这里就会出现问题

  • 回调嵌套了两层,看上去倒也没什么,但真实的开发环境中逻辑一定比这个复杂的多,例如登录失败的重试

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值