不使用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)
        }
    }
}
发布了20 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ange_li/article/details/104247017