OkHttp的请求过程原理以及二次封装
OkHttp支持HTTP2.0,1.0,1.1,SPDY,如果你的服务器不支持SPDY,会通过连接池减少请求延迟。缓存响应数据减少不必要的重复请求,支持链接自动恢复等等。
SPDY协议:谷歌基于HTTP一些不足弄的,它可以多路复用,对请求设置优先级,以及适当的压缩请求头。
HTTP2.0:基于SPDY新一代HTTP协议,它有采用更安全的加密算法,SSL协议等等。
Okhttp的大致请求过程:
1.通过构建者模式设计Request
2.Dispatcher分发器把Request分发到HttpEngine中
3.HttpEngine会先从Cache中查看有无该缓存,有则Response,无则去请求池ConnectionPool发请求(多路复用)
4(无缓存)HttpConnction去请求并
Response(这里会设计到RuteSelector执行的重连机制解决HTTP请求可能存在的问题)
流程图:
Okhttp的多路复用:
HttpEngine每次发请求会先调用nextConnection从ConnectionPool中获取一个HttpConnction,如果没有则会CreateNextConnection发请求
Okhttp的重连机制:
Call对象获取Response的时候回去判断,无则交给RuteSelector重连.
有点懒,贴一部分核心代码.
package net.callback;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import net.listener.DisponseDataHandle;
import net.listener.DisponseDataListener;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
/**
* CallBack获取Response封装
*/
public class CommonJsonCallBack implements Callback{
/**
* 依据自己公司服务器返回值
*/
protected final String RESULT_CODE ="ecode";
protected final int RESULT_CODE_VALUE =0;
protected final String ERROR_MSG ="emsg";
protected final String EMPTY_CODE ="";
protected final int NET_ERROR =-1;
protected final int JSON_ERROR =-2;
protected final int OTHER_ERROR =-3;
private DisponseDataListener mDisponseDataListener;
private Class<?> mClass;
private Handler mHandler;
public CommonJsonCallBack(DisponseDataHandle disponseDataHandle) {
mDisponseDataListener = disponseDataHandle.mDisponseDataListener;
mClass = disponseDataHandle.mClass;
//返回主线程的handle
mHandler = new Handler(Looper.getMainLooper());
}
@Override
public void onFailure(Request request, final IOException e) {
mHandler.post(new Runnable() {
@Override
public void run() {
mDisponseDataListener.onFailure(e);
}
});
}
@Override
public void onResponse(final Response response) throws IOException {
mHandler.post(new Runnable() {
@Override
public void run() {
handleResponse(response.body().toString());
}
});
}
private void handleResponse(String result) {
if(TextUtils.isEmpty(result)){
mDisponseDataListener.onFailure(NET_ERROR);
}else{
try {
JSONObject resultObj = new JSONObject(result);
if(resultObj.has(RESULT_CODE)){
if(resultObj.optInt(RESULT_CODE)!=RESULT_CODE_VALUE){
mDisponseDataListener.onFailure(JSON_ERROR);
}
else{
if(mClass == null){
mDisponseDataListener.onSuccess(resultObj);
}else{
//解析数据..........
mDisponseDataListener.onSuccess(resultObj);
}
}
}
} catch (JSONException e) {
mDisponseDataListener.onFailure(e);
}
}
}
}
就到此结束啦,二次封装代码地址OkhttpDemo,二次封装的核心大概就是build 产生request对象,去请求接口,获得数据然后丢给handle,通过handle再发送给callBack,最后回调给当前业务。/(ㄒoㄒ)/~~
推荐两个博客,应该看okhttp源码会有所帮助
上一篇: HDFS特点