OkHttp 的封装:
1、添加依赖
implementation 'com.squareup.okhttp3:okhttp:3.7.0'
implementation 'com.google.code.gson:gson:2.8.0'
implementation 'com.squareup.okio:okio:1.11.0'
2、CallBack的创建
我们需要使用CallBack来通知用户是否请求成功,因此我们在该抽象类中相应的创建抽象方法onSuccess()与onFailure(),同时我们每次想要的数据很大程度上也不相同,所以我们这里用<T>来接收想要的数据格式,并通过反射得到想要的数据类型,以下是CallBack的整体代码
public static abstract class ResultCallback<T> {
Type mType;
public ResultCallback() {
mType = getSuperclassTypeParameter(getClass());
}
static Type getSuperclassTypeParameter(Class<?> subclass) {
Type superclass = subclass.getGenericSuperclass();//返回父类的类型
if (superclass instanceof Class) {
throw new RuntimeException("Missing type parameter.");
}
ParameterizedType parameterized = (ParameterizedType) superclass;
return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
}
/**
* 请求成功回调
*
* @param response
*/
public abstract void onSuccess(T response);
/**
* 请求失败回调
*
* @param e
*/
public abstract void onFailure(Exception e);
}
}
3、对post 的简单封装
由于OkHttp 使用的是单例模式,我们就构建一个静态的得到实例的类
/**
* 通过单例模式构建对象
* @return OkHttpUtils
* **/
private synchronized static OkhttpUtils getInstance(){
if(mInstance == null){
mInstance = new OkhttpUtils();
}
return mInstance;
}
接下来就是配置OkHttp的参数,因为OkHttp 中的post 与 get方法要在子线程中运行,在这里我使用了Handler mHandler
private OkhttpUtils() {
/**
* 构建OkHttpClient
*/
mokHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS) //设置连接的超时时间
.writeTimeout(10, TimeUnit.SECONDS) //设置响应的超时时间
.readTimeout(30, TimeUnit.SECONDS) //请求的超时时间
.build();
/**
* 获取主线程的handler
*/
mHandler = new Handler(Looper.getMainLooper());
}
此时,我们把外部调用实例的部分完成了,接下来就是对post 的简单封装,post方法的参数有三个,分别是url,ResultCallBack,params。post部分的代码如下
/**
* post 请求
*
* @param url 请求url
* @param callback 请求回调
* @param params 请求参数
* */
public static void post(String url, final ResultCallback callback,List<Param> params){
getInstance().postRequest(url,callback,params);
}
接下来就是postRequest的部分,这部分的主要功能是构建post请求,具体代码如下
/**
* 构造post请求
*
* @param url 请求的url
* @param callback 结果回调的方法
* @param params 请求参数
* */
public void postRequest(String url, final ResultCallback callback,List<Param> params){
Request request = buildPostRequest(url,params);
deliveryResult(request,callback);
}
post 相关代码最后一部分就是deliveryResult的代码,这部分的功能是处理返回结果,相关代码如下
/**
* 处理返回结果的回调
* @param callback
* @param request
*
* */
public void deliveryResult(final Request request, final ResultCallback callback){
mokHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
sendFailCallback(callback, e);
Log.i(TAG, "onFailure: "+request.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i(TAG, "onResponse: "+response.message());
try {
String str = response.body().string();
if (callback.mType == String.class) {
sendSuccessCallBack(callback, str);
} else {
Object object = JsonUtils.deserialize(str, callback.mType);
sendSuccessCallBack(callback, object);
}
} catch (final Exception e) {
Log.e(TAG, "convert json failure", e);
sendFailCallback(callback, e);
}
}
});
}
4、对get的简单封装
其实,get 的封装与post 的封装大体相同,话不多说,具体代码如下
public static void post(String url, final ResultCallback callback,List<Param> params){
getInstance().postRequest(url,callback,params);
}
/**
* 构造get请求
*
* @param url 请求的url
* @param callback 结果回调的方法
* */
public void getRequest(String url, final ResultCallback callback){
final Request request = new Request.Builder().url(url).build();
deliveryResult(request,callback);
}
5、发送成功回调与发送失败回调
/**
* 发送失败回调
*
* @param callback
* @param e
* */
public void sendFailCallback(final ResultCallback callback, final Exception e){
mHandler.post(new Runnable() {
@Override
public void run() {
if(callback != null){
callback.onFailure(e);
}
}
});
}
/**
* 发送失败回调
*
* @param callback
* @param object
* */
public void sendSuccessCallBack(final ResultCallback callback, final Object object){
mHandler.post(new Runnable() {
@Override
public void run() {
if(callback != null){
callback.onSuccess(object);
}
}
});
}
以上就是封装的全部代码,之后会补充传输文件的相关代码,如有错误,欢迎评论区指正。