您的位置:首页 > 理论基础 > 计算机网络

OKHttp简单二次封装

2018-02-27 10:19 337 查看
倒入依赖:
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.google.code.gson:gson:2.8.0'
代码部分: 
1,定义请求结果回调接口
public interface CallBack<T> {
//请求数据成功时回调的方法 形参类型不确定 所以写成泛型的形式
void onSuccess(T response);
//请求数据失败时回调的方法
void onError(Throwable e);
}
2,定义请求数据回调接口
public interface NetInterface {
//请求数据 形参是url和请求成功传入的数据(因为这个没有解析的操作 只是拉取了数据 所以没有用到实体类(我们在解析的时候需要url和实体类))
void startRequest(String url, CallBack<String> callBack);
//请求并且解析数据 形参是url,实体类,解析好的数据
<T> void startRequest(String url, Class<T> tClass, CallBack<T> callBack);

}
3,OKTool工具类:
public class OkTool implements NetInterface {
//声明OkHttpClient对象
private OkHttpClient okHttpClient;
//声明解析用的Gson对象
private Gson gson;
//保证能将子线程中的数据传到主线程中(因为子线程不能操作UI)
private Handler handler = new Handler(Looper.getMainLooper());

public OkTool() {
//第一步:初始化OkHttpClient对象 并对其设置一些属性
okHttpClient = new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS)
.cache(new Cache(Environment.getExternalStorageDirectory(), 10 * 1024 * 1024))
.retryOnConnectionFailure(true)
.build();
//初始化Gson对象
gson = new Gson();
}

@Override
public void startRequest(String url, CallBack<String> callBack) {

}

@Override
public <T> void startRequest(final String url, final Class<T> tClass, final CallBack<T> callBack) {
//第二步:初始化请求对象
Request request = new Request.Builder().url(url).build();
//第三步:进行异步请求            //⬇️这是进行异步请求的方法
okHttpClient.newCall(request).enqueue(new Callback() {
//拉取数据失败
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
callBack.onError(e);
}
});
}
//成功拉取数据
@Override
public void onResponse(final Call call, final Response response) throws IOException {
//拉取网络数据
String str = response.body().string();
//解析网络数据
final T result = gson.fromJson(str,tClass);
handler.post( new Runnable() {
@Override
public void run() {
callBack.onSuccess(result);
}
});
}
});

}
}
4,NetTool工具类(主要就是想要将okHttpClient对象单例化):
public class NetTool implements NetInterface {
private static NetTool ourInstance;
//声明NetInterface接口对象
private NetInterface netInterface;

public static NetTool getInstance() {
//单例模式 保证了全局只用这一个对象
if (ourInstance == null){
synchronized (NetTool.class){
if (ourInstance == null){
ourInstance = new NetTool();
}
}
}

return ourInstance;
}

private NetTool() {
//在构造方法中对其进行初始化
netInterface = new OkTool();

}

@Override
public void startRequest(String url, CallBack<String> callBack) {

}

@Override
public <T> void startRequest(String url, Class<T> tClass, CallBack<T> callBack) {
netInterface.startRequest(url,tClass,callBack);
}
}
使用方法: 
NetTool.getInstance().startRequest(url,实体类.class,callback回调);原文链接:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息