转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118085035
本文出自【赵彦军的博客】
往期精彩文章:
Kotlin实战指南二十:flow
Kotlin实战指南十六:Synchronized、Volatile
Android Coroutines Channels
Android Flow遇见Retrofit网络请求实践
Android Kotlin协程和Retrofit结合使用
Retrofit 注解参数详解
先定义实体类
class Repo(val id: String, val name: String)
Retrofit 正常使用
定义接口 GitHubService
interface GitHubService {
@GET("users/{user}/repos")
fun listRepos(@Path("user") user: String?): Call<List<Repo>>
}
使用
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val retrofit = Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val service: GitHubService = retrofit.create(GitHubService::class.java)
val call = service.listRepos("zyj1609wz")
call.enqueue(object : Callback<List<Repo>> {
override fun onResponse(call: Call<List<Repo>>, response: Response<List<Repo>>) {
val list = response.body()
tv.text = "ok ${list?.get(0)?.name}"
}
override fun onFailure(call: Call<List<Repo>>, t: Throwable) {
tv.text = "fail ${t.message}"
}
})
}
}
Retrofit结合协程方式一
下面我们来使用协程请求网络接口
定义接口 GitHubService
interface GitHubService {
@GET("users/{user}/repos")
fun listRepos(@Path("user") user: String?): Call<List<Repo>>
}
在协程里面请求网络
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val retrofit = Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val service: GitHubService = retrofit.create(GitHubService::class.java)
GlobalScope.launch {
try {
val call = service.listRepos("zyj1609wz")
val response = call.execute()
val list = response.body()
tv.text = "ok ${list?.get(0)?.name}"
} catch (e: Exception) {
tv.text = "fail ${e.message}"
}
}
}
}
这样我们就完成了, 协程和retrofit 结合,这只是一个简单的运用,仅仅把协程当做线程来使用。
Retrofit结合协程方式二
把 GitHubService
函数改为挂起函数,并且把返回值从 Call
改为List
interface GitHubService {
@GET("users/{user}/repos")
suspend fun listRepos(@Path("user") user: String?): List<Repo>
}
使用
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val retrofit = Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val service: GitHubService = retrofit.create(GitHubService::class.java)
GlobalScope.launch(Dispatchers.Main) {
try {
//这是一个挂起函数
val list = service.listRepos("zyj1609wz")
tv.text = "ok ${list?.get(0)?.name}"
} catch (e: Exception) {
tv.text = "fail ${e.message}"
}
}
}
}
Retrofit结合协程方式三
async
模拟两个并行任务
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val retrofit = Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val service: GitHubService = retrofit.create(GitHubService::class.java)
GlobalScope.launch(Dispatchers.Main) {
try {
val list = async { service.listRepos("zyj1609wz") }
val list2 = async { service.listRepos("zyj1609wz") }
//两个请求是并行的
val result1 = list.await()
val result2 = list2.await()
tv.text = "ok ${result1[0].name} ${result2[0].name}"
} catch (e: Exception) {
}
}
}
}