OkHttp 网络通信层的库 ,Android 4.4后,HttpURLConnection底层实现已被OkHttp替换。可以见得OkHttp的性能已经被Google所认同。
OkHttp的优点:
支持HTTP2.0/SPDY
socket自动选择最好路线,并支持自动重连
拥有自动维护的socket连接池,减少握手次数
拥有队列线程池,轻松写并发
拥有Interceptors轻松处理请求与响应(比如GZIP压缩,LOG打印请求日志等)
实现基于Headers的缓存策略
一 OkHttp的使用
创建OkHttpClient对象:OkHttpClient client = new OkHttpClient();
创建网络请求:Request request = new Request.Builder().url("https://github.com/index.html").build();
得到Call对象:Call call = client.newCall(request); //创建的是一个RealCall对象
发送同步请求:Response response = call.excute();
发送异步请求 call.enqueue(newCallback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response)throwsIOException {
}
});
二 OkHttp 发送HTTP请求的初步分析
RealCall类#execute方法
client.dispatcher().executed(this);//把请求加入分发队列
Response result = getResponseWithInterceptorChain(false);//获取request对应的response 发起网络请求
RealCall类#enqueue方法
client.dispatcher().enqueue(newAsyncCall(responseCallback,forWebSocket));
请求包装成一个异步请求,AsyncCall继承自Runnable的子接口,实现了一个execute异步方法,Dispatcher会调用该方法,在execute方法内部会调用 getResponseWithInterceptorChain方法获得网络请求的response,随后利用回调方法将结果发送给调用者
Dispatcher类
中有两个集合分别为:runningAsyncCalls、readyAsyncCalls分别存放正在执行的请求,等待执行的请求
该类中有一个ThreadPoolExecutor线程池执行器,利用该执行器来执行异步请求的execute方法。异步请求发送在非当前工作线程,即创建异步请求的线程,而是从线程池中获取一条线程执行网络请求。同步请求则直接是在当前工作线程中执行。
该类对异步请求的管理是通过maxRequests、maxRequestsPerHost进行控制的,前者控制线程池中同时运行的最大请求数,防止同时运行线程过多,造成OOM。后者限制了同一hostname下的请求数,防止一个应用占用的网络资源过多,优化用户体验。
网友评论