前言:旧项目没有使用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)
}
}
}