美文网首页Android知识技巧总结Android开发经验谈Android开发
Android网络框架OkHttp源码分析一 使用流程源码分析

Android网络框架OkHttp源码分析一 使用流程源码分析

作者: 开飞机的老舒克 | 来源:发表于2017-12-20 10:47 被阅读35次

    前言

    OkHttp是目前很流行的网络请求框架。源码也设计很优秀的思想。有必要去探究一下源码。

    由于篇幅较长,分为五篇文章。本篇文章将讨论OkHttp的执行流程分析

    文章目录

    一、OkHttp执行流程分析

    二、同步请求流程分析

    三、异步请求流程分析

    四、任务调度核心dispatcher

    五、OkHttp中五大拦截器源码与功能分析

    OkHttp执行流程分析

    流程图

    流程图.png

    流程分析

    1、创建OkHttpClient

    OkHttpClient是一个通过build模式去构建的。

        public Builder() {
          dispatcher = new Dispatcher();
          protocols = DEFAULT_PROTOCOLS;
          connectionSpecs = DEFAULT_CONNECTION_SPECS;
          eventListenerFactory = EventListener.factory(EventListener.NONE);
          proxySelector = ProxySelector.getDefault();
          cookieJar = CookieJar.NO_COOKIES;
          socketFactory = SocketFactory.getDefault();
          hostnameVerifier = OkHostnameVerifier.INSTANCE;
          certificatePinner = CertificatePinner.DEFAULT;
          proxyAuthenticator = Authenticator.NONE;
          authenticator = Authenticator.NONE;
          connectionPool = new ConnectionPool();
          dns = Dns.SYSTEM;
          followSslRedirects = true;
          followRedirects = true;
          retryOnConnectionFailure = true;
          connectTimeout = 10_000;
          readTimeout = 10_000;
          writeTimeout = 10_000;
          pingInterval = 0;
        }
    

    然后通过build的build方法构建

        public OkHttpClient build() {
          return new OkHttpClient(this);
        }
    

    这里主要是通过build设计模式配置一些常用的参数信息,如超时时间等。

    2、创建Request

     public Builder() {
          this.method = "GET";
          this.headers = new Headers.Builder();
     }
    
     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,请求方法,请求体,请求头等。

    3、创建Call

    Call call = client.newCall(request);
    

    主要是通过client.newCall然后传入一个request来进行创建。

    @Override 
    public Call newCall(Request request) {
        return RealCall.newRealCall(this, request, false);
      }
    

    这里其实是创建了一个RealCall,RealCall也是OkHttp框架主要流程的一部分,主要是链接request和Response的桥梁,通过call进行同步和异步方法的执行。在同步和异步的执行方法里会返回response。例如:

      @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);
        }
      }
    
    

    4、通过Call执行同步或者异步请求,获取response

     Response response = call.execute();
     System.out.println(response.body().string());
    

    上面已经说过通过call的execute可以进行同步请求,然后获取response,这个response就是我们想要的返回的信息。

    也可以通过call.enqueue方法传入也一个监听器,进行异步请求。

    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
           //返回失败的情况             
           }
    
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            //调用成功的情况
                    }
                });
    

    5、完整的get请求,和post请求示例

    get
    OkHttpClient client = new OkHttpClient();
    
    String run(String url) throws IOException {
      Request request = new Request.Builder()
          .url(url)
          .build();
    
      Response response = client.newCall(request).execute();
      return response.body().string();
    }
    
    
    post
    public static final MediaType JSON
        = MediaType.parse("application/json; charset=utf-8");
    
    OkHttpClient client = new OkHttpClient();
    
    String post(String url, String json) throws IOException {
      RequestBody body = RequestBody.create(JSON, json);
      Request request = new Request.Builder()
          .url(url)
          .post(body)
          .build();
      Response response = client.newCall(request).execute();
      return response.body().string();
    }
    

    6、总结

    这篇只是简单分析OkHttp的使用流程,其实还有一部分核心的流程是在源码中体现的比如dispatcher调度器的使用流程,与拦截器的核心功能等,这一部分将在后面的总结中进行单独分析。

    相关文章

      网友评论

        本文标题:Android网络框架OkHttp源码分析一 使用流程源码分析

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