直接上代码:
OkhttpUtils类:
/**
* 自定义Callback
*/
fun postJsonRequest(map:HashMap<String,String>,url:String,okhttpCallBack: OkhttpCallBack){
if (TextUtils.isEmpty(url)){ return }
var builder: FormBody.Builder = FormBody.Builder();
if (map.size > 0){
for (key in map.keys){
key.let {
builder.add(it, map[it].toString())
}
}
}
val formBody:FormBody = builder.build()
val request: Request = Request.Builder().url(url)
.post(formBody)
.build()
val call: Call? = okhttp?.newCall(request)
call?.enqueue(okhttpCallBack)
}
OkhttpCallBack类:
class OkhttpCallBack<T> : Callback{
private var mOkHttpCall: OkHttpCall<T>? = null
constructor()
constructor(okHttpCall: OkHttpCall<T>){
mOkHttpCall = okHttpCall
}
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 typeToken:TypeToken<RequestBodyContent<T>> = object : TypeToken<RequestBodyContent<T>>(){};
val content: RequestBodyContent<T>? = JsonUtils.jsonTo(it1,
typeToken)
mOkHttpCall?.onSuccess(content)
}
}
}
}
interface OkHttpCall<T>{
fun onSuccess(requestBody: RequestBodyContent<T>?);
fun onError(error: String);
}
}
JsonUtils类解析类封装:
class JsonUtils {
companion object {
/**
* 通过该方法可以解析两层
* RequestBodyContent 一层 固定的一层
* T 一层(可任意实体类)
*/
fun jsonTo(json: String?,typeEntity :TypeToken<RequestBodyContent>): RequestBodyContent? {
val type:Type = typeEntity.type
return Gson().fromJson(json, type)
}
}
}
使用方法:PeopleBean是实体类
with(OkhttpUtils){
getInstance().postJsonRequest(map,“”, OkhttpCallBack(
object : OkhttpCallBack.OkHttpCall{
override fun onSuccess(requestBody: RequestBodyContent?) {
}
override fun onError(error: String) {
}
}
))
}