我是靠谱客的博主 强健蜜粉,最近开发中收集的这篇文章主要介绍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接口回调所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部