OkHttp 介绍和使用

2016-09-29  本文已影响0人  菜鸟汤先生

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下的请求数,防止一个应用占用的网络资源过多,优化用户体验。

上一篇 下一篇

猜你喜欢

热点阅读