美文网首页
OkHttp 介绍和使用

OkHttp 介绍和使用

作者: 菜鸟汤先生 | 来源:发表于2016-09-29 15:58 被阅读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下的请求数,防止一个应用占用的网络资源过多,优化用户体验。

    相关文章

      网友评论

          本文标题:OkHttp 介绍和使用

          本文链接:https://www.haomeiwen.com/subject/exucyttx.html