不使用retrofit 情况下用Kotlin 的deferred 封装请求框架?

前言:旧项目没有使用retrofit,但是我又想让自己封装的请求框架支持Kotlin 的deferred ,于是参考了

com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory,写出了以下的代码,

自测可以使用。

 

override fun <T> excuteOnDeferred(request: Request, cls:Class<T>):Deferred<T>{
        val req:okhttp3.Request =okhttp3.Request.Builder().url(request.mUrl!!).build()
        val deferred = CompletableDeferred<T>()
        val call =  mOkHttpClient.newCall(req)
        deferred.invokeOnCompletion {
            if (deferred.isCancelled) {
                call.cancel()
            }
        }

        call.enqueue( object :Callback {
            override fun onResponse(call: Call, response: Response) {
                try {
                    val result = response.body()!!.string()
                    Log.d("http", result)
                    if (cls!= String::class.java) {
                        val response:T? = GsonService.parseJson(result, cls)
                        if(response!=null){
                            deferred.complete(response)
                        }else{
                            deferred.completeExceptionally(Throwable("parseJson == null"))
                        }
                    } else {
                        deferred.complete(result as T)
                    }

                } catch (e: IOException) {
                    deferred.completeExceptionally(e)
                }
            }

            override fun onFailure(call: Call, e: IOException) {
                deferred.completeExceptionally(e)
            }
        })
        return deferred
    }

 

如何使用

class KotlinNetActivity : AppCompatActivity(){

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
//        val api = HttpTool.getInstance().retrofit.create(Api::class.java)
        GlobalScope.launch(Dispatchers.Main) {
            val dataBean = withContext(Dispatchers.IO) {
//                api.getWeather().await()
                val r=Request()
                r.mUrl="http://t.weather.sojson.com/api/weather/city/101030100"
                HttpUtil.instance.excuteOnDeferred(r,WeatherData::class.java).await()
            }

            val textView = TextView(applicationContext)
            textView.text = dataBean.message
            setContentView(textView)
        }
    }
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值