}
依次类推,我们可以想到,如果请求很多的话,第一 代码结构会很难看,第二 写着写着就很乱了,那么协程就可以很好的解决这个问题,下面我们来看使用协程的方式 怎么写.
首先,对于一个耗时的操作,我们需要将他切换到后台线程执行,withContext函数可以构建一个协程作用域,他必须在挂起函数或者协程中执行,suspend关键字是kotlin为我们提供的 用于标记挂起函数的关键字。我们修改getMessageFromNetwork方法如下:
/**
- 从服务器取信息
*/
private suspend fun getMessageFromNetwork(): String {
var name = “”
withContext(Dispatchers.IO) {
for (i in 0…1000000) {
//这里模拟一个耗时操作
}
name = “Huanglinqing1111”
}
return name
}
在onCreate中协程中直接这样写:
GlobalScope.launch(Dispatchers.Main) {
var name = getMessageFromNetwork()
showMessage(name)
}
运行结果如下所示:
如果我们有多个请求呢,那就再多加几个
GlobalScope.launch(Dispatchers.Main) {
var name = getMessageFromNetwork()
showMessage(name)
var name1 = getMessageFromNetwork()
showMessage(name1)
var name2 = getMessageFromNetwork()
showMessage(name2)
}
这样getMessageFromNetwork在后台执行,showMessage在前台执行,由此看来。
协程比线程的优势在什么地方?
1、协程可以帮我们自动切线程
2、摆脱了链式回调的问题
Retrofit 如何使用协程
从Retrofit2.6.0开始,retrofit就自动支持协程了,这里我们从「聚合数据」上找到一个开放api
我们先来看之前我们怎么使用的,首先在Apiservice中定义一个接口如下:
@GET(“https://wanandroid.com/article/listproject/0/json”)
fun queryData(): Call<BaseReqData>
在activity中添加如下代码:
var retrofit = Retrofit.Builder()
.baseUrl(“http://v.juhe.cn/”)
.addConverterFactory(GsonConverterFactory.create())