因为Retrofit自 2.6 版本后,原生支持协程, Retrofit 使用协程改造过后,能有效的精简业务代码,进而加速开发进度;
今天对相关代码进行了改造,现做个笔记记录一下
suspend改造前代码:
@GET("/abc/test/demo")
fun getListOld(@Query("ver") ver: String?): Call<MyResponse>
使用示例代码:
@Test
fun testGetList(){
val context = InstrumentationRegistry.getInstrumentation().targetContext
val ver = "ver_123"
val call = MyService.getDemo().getList(ver)
call.enqueue(object : Callback<MyRespose> {
override fun onResponse(call: Call<MyRespose>, response: Response<MyRespose>) {
LogUtils.log(context, " response.raw().toString = ${response.raw().toString()} ${response.raw().headers.toString()}")
var value = response.body()?.value
LogUtils.log(context, "onResponse value = ${value }")
}
override fun onFailure(call: Call<MyRespose>, t: Throwable) {
t.printStackTrace()
LogUtils.log(context, "onFailure ${t.message}")
}
});
}
suspend改造后代码:
@GET("/abc/test/demo")
suspend fun getList(@Query("ver") ver: String?): Response<MyResponse>
调用代码的示例:
@Test
fun test_getListSuspend(){
val context = InstrumentationRegistry.getInstrumentation().targetContext
LogUtils.log(context, "test_getListSuspend")
val scope = CoroutineScope(Dispatchers.IO)
val coroutineJob = scope.launch{
LogUtils.log(context, "coroutineJob .launch")
val response = MyService.getDemo().getList("ver_123")
LogUtils.log(context, "response = $response")
scope.cancel()
}
}
可以用来刷新界面的协程代码片段
var job: Job? = null;
job = MainScope().launch {
Log.d("demo","---start---")
val response = MyService.getDemo().getList("ver_123").getList("ver_123")
val view:TextView = TextView(context)
view.textSize = 26f
view.text = response.raw().toString()
(context.window.decorView as ViewGroup).addView(view)
Log.d("demo","---end---")
job?.run {
this.cancel()
}
};