Kotlin Coroutines and Retrofit

协程(Coroutines)作为kotlin语言的新特性,在写这篇文章时,已经发布了稳定版。
所以我们可以放心大胆的应用到我们的项目中去了。

一。简单介绍下协程

协程在编程语言中并不是一个新的东西,它的存在主要是为了解决异步编程的痛点。
在java中常见的解决方法大概有两种:

  1. callback回掉(容易造成Callback Hell)
  2. rxJava(编程的重点变为了记忆各种操作符)

这些都不是完美的解决方案,异步编程的终极目标是像写同步代码一样写异步代码。
协程很好的达到了这一目的。

二。在android项目中引入协程(假设你已经引入了retrofit)

在application 级的build.gradle文件中添加如下代码

dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'
}

同时,升级kotlin版本到1.3以上

在项目的build.gradle中引入如下代码

implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'

该库的作用是使用协程把网络查询结果封装起来

声明RetrofitService类

interface RetrofitService {
    @GET("/posts")
    fun getPosts(): Deferred>>
}

可以注意到我们使用Deferred封装了查询结果。Deferred可以调用await方法来挂起网络请求操作,避免阻塞主线程。

创建RetrofitService

object RetrofitFactory {
    const val BASE_URL = "https://jsonplaceholder.typicode.com"

    fun makeRetrofitService(): RetrofitService {
        return Retrofit.Builder()
                .baseUrl(BASE_URL)
               .addCallAdapterFactory(CoroutineCallAdapterFactory())
                .build().create(RetrofitService::class.java)
    }
}

可以注意到CoroutineCallAdapterFactory类,该类进行了网络请求结果到协程的转换操作。

最终我们可以在MainActivity处进行调用

lass MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val service = RetrofitFactory.makeRetrofitService()
        GlobalScope.launch(Dispatchers.Main) {
            val request = service.getPosts()
            try {
                val response = request.await()
                // 主线程更新数据...
            } catch (e: HttpException) {
                toast(e.code())
            } catch (e: Throwable) {
                toast("Ooops: Something else went wrong")
            }
        }
    }
}

完毕。

你可能感兴趣的:(Kotlin Coroutines and Retrofit)