Okhttp同步申无锡小程序开发公司请源码剖析

2021-11-15 07:58:41 无锡雷霆

进阶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(this); ...

client.dispatcher前往一个散发器。而后通过散发器来执行操做:

在同步申请中,调用executed方法,很简略酒吧这个Call对象减少到队列当中。

Dispatcher的做用次要是维持call申请发给他 的形态,同时维护了一个线程池,开启了网络申请。

从源码中我们可以看到Dispatcher

这几个申请队列表明着不一样形态下的申请状况。

紧接着通过阻拦器链依次调用执行操做。
最后还调用了Finish方法

留意第三个参数,为false,这个方法的次要做用就是移除以后的申请,若是不能移除的话,前往同样,我们可以留意到,校园点餐小程序,同步申请不需要调用promoteCalls,只要在异步申请的时分才会调用到,社区团购开发,这个方法之后我们在讲。

最后判别,正在将要执行的申请队列汇合为0而且闲调用的回调不为null时,调用其run方法。此时,同步方法执行实现。

Okhttp,同步,请求,源码分