我是靠谱客的博主 强健蜜粉,最近开发中收集的这篇文章主要介绍kotlin协程+retrofit简单取消接口回调kotlin协程 简单处理取消普通方法回调&retrofit接口回调,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
kotlin协程 简单处理取消普通方法回调&retrofit接口回调
build
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1"
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0'
//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation('com.github.ihsanbal:LoggingInterceptor:3.1.0') {
exclude group: 'org.json', module: 'json'
}
方法回调
全局处理协程方法Exception
object MyUtils {
//全局处理协程方法Exception
suspend fun trycatch(isShowMsg:Boolean = false, block:suspend () -> Unit){
try {
block.invoke()
}catch (e: Throwable){
e.printStackTrace()
if(isShowMsg){
ToastUtils.showLong(e.localizedMessage)
}
}
}
}
使用
viewBinding.btCalculate.setOnClickListener {
calculate(123472346,-1128738,object :MyCallBack<Int>{
override fun onSucceed(t: Int) {
viewBinding.tvResult.text = "${viewBinding.tvResult.text.trim()} $t"
}
override fun onError(e: String) {
ToastUtils.showLong(e)
}
})
lifecycleScope.launch {
MyUtils.trycatch(true) {
viewBinding.tvResult.text = "${viewBinding.tvResult.text.trim()} ${aCalculate(134546021, 1132719273)}"
LogUtils.e("计算成功,下一步")
}
}
}
...........
//普通回调方法
private fun calculate(a:Int, b:Int,callBack:MyCallBack<Int>){
if(a<0 || b<0){
callBack.onError("计算值不能小于0")
return
}
val result = a+b
callBack.onSucceed(result)
}
interface MyCallBack<T>{
fun onSucceed(t:T)
fun onError(e:String)
}
//挂载可删除协程
private suspend fun aCalculate(a:Int,b:Int):Int{
return suspendCancellableCoroutine<Int> {
if(a < 0 || b < 0){
it.resumeWithException(Exception("计算值不能小于0"))
}else {
val result = a + b
it.resume(result)
}
}
}
retrofit接口回调
api接口
retrofit自2.6.0之后的版本支持接口请求方法添加suspend声明为挂起函数,省去call回调直接返回结果,如果请求失败(404/500…)则会引发异常,可添加try catch处理请求失败
interface ApiService {
@GET("weather")
suspend fun getWeather(
@Query("country") country:String,
@Query("city") city:String
):BaseResponse<WeatherBean?>?
//...
}
retrofit
添加挂起函数request方法统一请求接口,传入挂起的接口调用,捕获异常并处理CODE码
object Api {
private var retrofit = Retrofit.Builder()
.baseUrl("http://服务器ip:端口/")
.client(OkHttpClient.Builder()
.addInterceptor(
LoggingInterceptor.Builder()
.setLevel(if(BuildConfig.DEBUG) Level.BASIC else Level.NONE)
.log(Log.INFO)
.build())
.build()
)
.addConverterFactory(GsonConverterFactory.create())
.build()
private var service: ApiService = retrofit.create(ApiService::class.java)
private suspend fun <T :Any?> request(call: suspend () -> T):T?{
return try {
call.invoke().apply {
val data = this as BaseResponse<*>?
//与服务端约定的CODE处理
when (data?.code){
1 ->{
}
else ->{
}
}
}
}catch (e:Exception){
e.printStackTrace()
null
}
}
suspend fun getWeather(country:String, city:String): BaseResponse<WeatherBean?>? {
return request{
service.getWeather(country, city)
}
}
//...
}
使用
开启协程并调用接口,亦或者将接口的调用放入ViewMode
binding.btnGetWeather.setOnClickListener {
lifecycleScope.launch {
/*//不处理请求异常
Api.getWeather("广东", "深圳")?.let {
binding.tvResult.text = it.toString()
}*/
val weatherBean = Api.getWeather("广东","深圳")?.data
if(weatherBean == null){
binding.tvResult.text = "请求异常"
}else{
binding.tvResult.text = weatherBean.toString()
}
}
}
最后
以上就是强健蜜粉为你收集整理的kotlin协程+retrofit简单取消接口回调kotlin协程 简单处理取消普通方法回调&retrofit接口回调的全部内容,希望文章能够帮你解决kotlin协程+retrofit简单取消接口回调kotlin协程 简单处理取消普通方法回调&retrofit接口回调所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复