整合retrofit、kotlin使用kotlin的协程操作,最终调用api的方式如下
progressDialog.show()//请求前弹出进度条 进度条的实现这里未给出
RetrofitServiceManager.create(PosApi::class.java).saveUser(user).get(){
//请求成功后的处理
Log.i("xiaochangyan",JsonObject.toJSONString(it))
progressDialog.hide()
}
第一步添加引用库:
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.5'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.5"
//okhttp
implementation("com.squareup.okhttp3:okhttp:4.0.0")
//fastjson
implementation"com.alibaba:fastjson:1.2.58"
//retrofit
implementation'com.squareup.retrofit2:retrofit:2.0.2'
//retrofit返回json的适配工厂,选用fastjson
implementation'org.ligboy.retrofit2:converter-fastjson-android:2.1.0'
第二部创建retrofit管理类:
package com.imsc.network
import android.content.Context
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import okhttp3.Cache
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Response
import retrofit2.Retrofit
import retrofit2.converter.fastjson.FastJsonConverterFactory
import java.io.File
import java.io.IOException
import java.util.concurrent.TimeUnit
class RetrofitServiceManager {
lateinit var context: Context;
private lateinit var mRetrofit: Retrofit
private val DEFAULT_TIME_OUT:Long =30;
companion object{
val base_url ="http://"//这里自己填
val instance: RetrofitServiceManagerby lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED){
RetrofitServiceManager()
}
fun create(service: Class?):T {
return instance.mRetrofit.create(service)
}
}
fun init(context: Context){
this.context = context.applicationContext;
this.mRetrofit = getRetrofit(context);
}
private fun getOkHttpClientBuilder(context: Context): OkHttpClient.Builder? {
val builder = OkHttpClient.Builder().apply {
connectTimeout(DEFAULT_TIME_OUT,TimeUnit.SECONDS)//连接 超时时间
writeTimeout(DEFAULT_TIME_OUT,TimeUnit.SECONDS)//写操作 超时时间
readTimeout(DEFAULT_TIME_OUT,TimeUnit.SECONDS)//读操作 超时时间
retryOnConnectionFailure(true)//错误重连
val cacheFile = File(context.cacheDir,"cache")
val cache = Cache(cacheFile,1024 *1024 *100)//100Mb
cache(cache)
val headerInterceptor: Interceptor =object : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val originalRequest = chain.request()
val requestBuilder = originalRequest.newBuilder()
.addHeader("Accept-Encoding","gzip")
.addHeader("Accept","application/json")
.addHeader("Content-Type","application/json; charset=utf-8")
.method(originalRequest.method, originalRequest.body).apply {
addHeader("Authorization","Bearer " +"")//添加请求头信息,服务器进行token有效性验证
}
// val username: String = SharedPreferencesChace.create(context).get("username")
// requestBuilder.addHeader(
// "username",
// SharedPreferencesChace.create(context).get("username")
// )
val request = requestBuilder.build()
// request.url().newBuilder().addQueryParameter("username", "");
return chain.proceed(request)
}
}
addInterceptor(headerInterceptor)
}
//项目中设置头信息
return builder
}
private fun getRetrofit(context: Context): Retrofit {
val builder = getOkHttpClientBuilder(context)
// 创建Retrofit
return Retrofit.Builder()
.client(builder!!.build())
.addCallAdapterFactory(KotlinCallAdapterFactory())//RxJava2CallAdapterFactory.create() 使用了自定的适配器
.addConverterFactory(FastJsonConverterFactory.create())
.baseUrl(base_url +"TXS.Api/")
.build()
}
}
第四步创建KotlinCallAdapterFactory,需要了解自定义retrofit的CallAdapterFactory
package com.imsc.network
import com.alibaba.fastjson.JSONObject
import kotlinx.coroutines.*
import retrofit2.Call
import retrofit2.CallAdapter
import retrofit2.Response
import retrofit2.Retrofit
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type
class KotlinCallAdapter(private val responseType:Type):CallAdapter{
override fun responseType(): Type {
return responseType
}
//统一一个错误格式,可以按自己需求更改
private fun error(message:String?):JSONObject{
var error = JSONObject()
error.put("success",false)
error.put("message",message)
return if(responseType is JSONObject)error else error.toJavaObject<Any>(responseType)
}
override fun adapt(call: Call): Any? {
var task = GlobalScope.async {
try{
var response:Response = call.execute()
when{
call.isCanceled->{error("请求被取消")}
response.isSuccessful -> {response.body()}
else->{
error(response.errorBody().string())
}
}
}catch (e:Exception){
return@async error(e.message)
}
}
return task
}
}
class KotlinCallAdapterFactory: CallAdapter.Factory() {
override fun get(returnType: Type?,annotations: Array?,retrofit: Retrofit?): CallAdapter<*>? {
val rawType = getRawType(returnType)
if (rawType == Deferred::class.java && returnTypeis ParameterizedType) {
val callReturnType =getParameterUpperBound(0,returnType)
return KotlinCallAdapter(callReturnType)
}
return null
}
}
//默认提供一个同步调用
fun <T> Deferred<T>.get(back:(t:T)->Unit){
GlobalScope.launch(Dispatchers.IO) {
val data = this@get.await()
withContext(Dispatchers.Main){
back.invoke(data)
}
}
}
fun <T> Deferred<T>.get():T{
return runBlocking {
val data = this@get.await()
data
}
}
第五步创建api
package com.imsc.imsc_iomp.api
import com.alibaba.fastjson.JSONObject
import kotlinx.coroutines.Deferred
import retrofit2.http.*
interface FullApi{
@POST("odata/TXS/T_TXS_IBEACONEntity")
fun saveUser(@Body data:User): Deferred<BackModel>
}