retrofit、kotlin(使用协程)的整合

整合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>

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。