进阶android,OKhttp源码剖析——同步申请的源码剖析android
OKhttp是我们经常用到的框架,做为开发者们,我们不只仅要学会灵敏利用,还要知道他的源码是如何设计的。面试
今天我们来剖析一下OKhttp 同步申请的执行流程和源码剖析缓存
so,老样子,无锡最专业app开发,我们先来一张图网络
从上图可以看出,无论是同步申请仍是异步申请,我们都需要建设一个OKhttpClient对象,用到的是build结构者形式,建设Request对象,而后再OKhttpClient的newCall方法和Request来封装我们的call对象。建设我们的实践申请的call对象,从上图可以看到,对于同步申请,我们调用的是excute方法,异步申请调用的是equeue方法。框架
我们看一下作简略利用异步
OkHttpClient okHttpClient = new OkHttpClient.Builder() .readTimeout(10, TimeUnit.SECONDS) .build(); Request request = new Request.Builder().url("https://blog.csdn.net/androidstarjack").build(); Call call = okHttpClient.newCall(request); try { call.execute();//同步申请 call.enqueue(new Callback() {//异步申请 @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { } }); } catch (IOException e) { e.printStackTrace(); }我们先看一下okhttp的build ide
首先我们通过源码可以看出,okhttp的建设时通过build方法来建设的,其中初始化了一些事件,好比建设一个dispatcher阻拦器,和一个链接池,链接池只需是衔接形态的保存以及复用。build是要是建设 okhttp是所需要的参数。源码剖析
在建设Request建设的时分也是用结构者形式停止建设的,源码以下:ui
Builder(Request request) { this.url = request.url; this.method = request.method; this.body = request.body; this.tag = request.tag; this.headers = request.headers.newBuilder(); }request的build结构里面初始化了一些申请的URL,申请方法哈申请头号申请报文的一些信息。this
Call对象 是通过他的父亲RealCall来实现的。
Call对象持有了Okhttp 和Request两个对象,同时呢还建设了一个缓存阻拦器RetryAndFollowUpInterceptor,用于所需要的重定向操做。
通过调用okhttpClient的newCAll来实现CALL的新建,停止相应的操做
紧接着调用execute方法来实现同步申请!
@Override public Response execute() throws IOException { synchronized (this) { if (executed) throw new IllegalStateException("Already Executed"); executed = true; } captureCallStackTrace(); eventListener.callStart(this); try { client.dispatcher().executed(this); Response result = getResponseWithInterceptorChain(); if (result == null) throw new IOException("Canceled"); return result; } catch (IOException e) { eventListener.callFailed(this, e); throw e; } finally { client.dispatcher().finished(this); } }//布尔值executed示意一个okhttp申请只能运转执行一次,而后开启捕捉一些谬误堆栈信息,点用一个eventListener监听方法,
接卸来是调用散发器的executed方法。这才是重中之重。
client.dispatcher前往一个散发器。而后通过散发器来执行操做:
在同步申请中,调用executed方法,很简略酒吧这个Call对象减少到队列当中。
Dispatcher的做用次要是维持call申请发给他 的形态,同时维护了一个线程池,开启了网络申请。
从源码中我们可以看到Dispatcher
这几个申请队列表明着不一样形态下的申请状况。
紧接着通过阻拦器链依次调用执行操做。
最后还调用了Finish方法
留意第三个参数,为false,这个方法的次要做用就是移除以后的申请,若是不能移除的话,前往同样,我们可以留意到,校园点餐小程序,同步申请不需要调用promoteCalls,只要在异步申请的时分才会调用到,社区团购开发,这个方法之后我们在讲。
最后判别,正在将要执行的申请队列汇合为0而且闲调用的回调不为null时,调用其run方法。此时,同步方法执行实现。