协程(Coroutines)作为kotlin语言的新特性,在写这篇文章时,已经发布了稳定版。
所以我们可以放心大胆的应用到我们的项目中去了。
一。简单介绍下协程
协程在编程语言中并不是一个新的东西,它的存在主要是为了解决异步编程的痛点。
在java中常见的解决方法大概有两种:
- callback回掉(容易造成Callback Hell)
- 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<Response<List<Post>>>
}
可以注意到我们使用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")
}
}
}
}
完毕。