扔物线--Kotlin协程训练营2期-2

 

笔记仅做自己学习用,方便自己复习知识。若正好可以帮助到Viewer,万分欣喜~

若博客侵权,扔物线大大不允许放上面,麻烦告知


本文是扔物线Kotlin第二期协程训练营的第二篇文章

没看过第一篇文章的可以先看第一篇:https://blog.csdn.net/bluerheaven/article/details/106969835

 

目录

一、Retrofit对协程的支持

二、Retrofit和RxJava的结合使用

三、合并网络请求

1. 自己实现合并网络请求

2. 用Rxjava实现合并网络请求

3. 用Kotlin协程实现合并网络请求

四、协程和Jetpack架构组件

1. 协程泄漏

2. Jetpack组件对协程的支持

五、协程和线程

六、本质探秘

1. 协程是怎么切线程的?

2. 协程为什么可以从主线程“挂起”,却不卡主线程?

3. 协程的delay()和Thread.sleep()


 

 

一、Retrofit对协程的支持

先来看一下Kotlin使用Retrofit的方式,不适用协程:

    @GET("users/{user}/repos")
    fun listRepos(@Path("user") user: String): Call>
        val retrofit = Retrofit.Builder()
            .baseUrl("https://api.github.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
        val api = retrofit.create(Api::class.java)
        api.listRepos("rengwuxian").enqueue(object:Callback?>{
            override fun onFailure(call: Call?>, t: Throwable) {
            }

            override fun onResponse(call: Call?>, response: Response?>) {
                textView.text = response.body()?.get(0).name
            }
        })

 第一段代码定义Api.kt接口类,第二段代码,创建Retrofit对象,并动态代理给val api,通过api调用执行网络请求。

再来看看使用Kotlin协程的写法:

@GET("users/{user}/repos") suspend fun listReposKt(@Path("user") user: String): List
        val retrofit = Retrofit.Builder()
            .baseUrl("https://api.github.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
        val api = retrofit.create(Api::class.java)
        
        GlobalScope.launch(Dispatchers.Main) {
            try {
                val repos = api.listReposKt("rengwuxian") // 后台
                textView.text = repos[0].name // 前台
            } catch (e: Exception) {
                textView.text = e.message // 出错
            } 
        }

第一段代码统一定义了接口,第二段代码同样创建了Retrofit对象,但是在使用时就不一样了。使用Kotlin协程不再需要回调,直接把前台后台代码按顺序写下来就可以了。(这里我想吐槽:onFailure用try catch替代了,瞬间感觉有点low...)

训练营的第一篇文章说过,suspend只是起到标记和提醒的作用,并不能切换线程,那么这里是怎么切线程的?答案是,Retrofit动态帮助我们创建了代理类,切换了线程。(Retrofit对Kotlin的支持还真是强大)

这里还有个坑:如果不写try catch代码,也不会报错,因为Kotlin没有checked Exception。而Java是有的。(如果在Java里写可能抛出异常的代码,而没有try catch,编译器会报错)

 

二、Retrofit和RxJava的结合使用

    @GET("users/{user}/repos")
    fun listReposRx(@Path("user") user: String): Single>
        val retrofit = Retrofit.Builder()
            .baseUrl("https://api.github.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
            .build()
        val api = retrofit.create(Api::class.java)

        api.listReposRx("rengwuxian")
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(object : SingleObserver?> {
                override fun onSuccess(t: List) {
  

你可能感兴趣的:(扔物线--Kotlin协程训练营2期-2)