上一节有个问题,就是嵌套解析有问题,什么是嵌套解析呢?比如你最外层是一个body,里面是不是一般里面都有一个data,常规解析方法是先解析最外层body,再解析里面的data,这种方法比较麻烦,这里就可以通过嵌套解析的方法来一次性解析,这一节使用啦拦截器,拦截器不名思意就是拦截请求使用到的,为何要拦截器呢?比如要给请求追加一些东西(比如header等等)这时就需要拦截器,学过java后端的又对拦截器比较了解的,因为每一次对后端的请求,可以做到拦截验证该请求是否有该权限,同理:
直接上代码:
修改OkhttpUtils类:
@Synchronized
fun getInstance():OkhttpUtils{
if (instance == null) instance = OkhttpUtils()
okhttp = OkHttpClient().newBuilder()
.retryOnConnectionFailure(true)
.connectTimeout(10000, TimeUnit.SECONDS) //连接超时
.readTimeout(10000, TimeUnit.SECONDS) //读取超时
.writeTimeout(10000, TimeUnit.SECONDS) //写超时
.addInterceptor(HttpInterceptor())//添加拦截器
.build()
return instance!!
}
修改OkhttpCallBack类:
class OkhttpCallBack : Callback{
private var mOkHttpCall: OkHttpCall<T>? = null
private var mTypeToken:TypeToken<RequestBodyContent<T>>? = null
constructor()
constructor(okHttpCall: OkHttpCall<T>,typeToken:TypeToken<RequestBodyContent<T>>){
mOkHttpCall = okHttpCall
mTypeToken = typeToken
}
override fun onFailure(call: Call, e: IOException) {
mOkHttpCall?.onError("")
}
override fun onResponse(call: Call, response: Response) {
val body: String? = response.body?.string();
response.body?.let {
//一定要Dispatchers.Main 不然协程不会切换线程
GlobalScope.launch(Dispatchers.Main) {
body?.let { it1 ->
val content: RequestBodyContent<T>? = JsonUtils.jsonTo2(it1,
mTypeToken)
Log.e("token",content.toString())
mOkHttpCall?.onSuccess(content)
}
}
}
}
interface OkHttpCall<T>{
fun onSuccess(requestBody: RequestBodyContent<T>?);
fun onError(error: String);
}
}
新增HttpInterceptor类:
class HttpInterceptor: Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request: Request = chain.request()
return chain.proceed(request)
}
}
JsonUtils修改类:
fun jsonTo2(json: String?, typeEntity: TypeToken<RequestBodyContent>?): RequestBodyContent? {
val type:Type = typeEntity!!.type
return Gson().fromJson(json, type)
}
使用方法:这里的map对象就是hashmap请求参数 Zodiac就是实体类 RequestBodyContent是最外层的类
val datType:TypeToken<RequestBodyContent> = object : TypeToken<RequestBodyContent>(){};
with(OkhttpUtils){
getInstance().postJsonRequest(map,“url”, OkhttpCallBack(
object : OkhttpCallBack.OkHttpCall{
override fun onSuccess(requestBody: RequestBodyContent?) {
Log.e(“”,“” + requestBody?.result?.name)
}
override fun onError(error: String) {
}
}
,datType))
}