Android Network

OkHttp源码分析(一)综述

2017-05-06  本文已影响60人  J__Beyond

导图

OkHttp源码分析.png

简介

OkHttp是Square公司开源的一款面向Java和Android平台的HTTP客户端,是目前最主流的网络框架之一。在Android4.4中,HttpUrlConnection底层已经默认使用okhttp实现。

特点

基本用法

创建OkHttpClient对象

OkHttpClient为OkHttp初始的配置中心,通过它可以完成初始参数的配置,设置超时时间,添加自定义拦截器,初始化线程池,代理等工作

public OkHttpClient() {
    this(new Builder());
  }
  OkHttpClient(Builder builder) {
    this.dispatcher = builder.dispatcher;
    this.proxy = builder.proxy;
    this.protocols = builder.protocols;
    this.connectionSpecs = builder.connectionSpecs;
    this.interceptors = Util.immutableList(builder.interceptors);
    this.networkInterceptors = Util.immutableList(builder.networkInterceptors);
    this.proxySelector = builder.proxySelector;
    this.cookieJar = builder.cookieJar;
    this.cache = builder.cache;
    this.internalCache = builder.internalCache;
    this.socketFactory = builder.socketFactory;

    boolean isTLS = false;
    for (ConnectionSpec spec : connectionSpecs) {
      isTLS = isTLS || spec.isTls();
    }
    if (builder.sslSocketFactory != null || !isTLS) {
      this.sslSocketFactory = builder.sslSocketFactory;
      this.certificateChainCleaner = builder.certificateChainCleaner;
    } else {
      X509TrustManager trustManager = systemDefaultTrustManager();
      this.sslSocketFactory = systemDefaultSslSocketFactory(trustManager);
      this.certificateChainCleaner = CertificateChainCleaner.get(trustManager);
    }
    this.hostnameVerifier = builder.hostnameVerifier;
    this.certificatePinner = builder.certificatePinner.withCertificateChainCleaner(
        certificateChainCleaner);
    this.proxyAuthenticator = builder.proxyAuthenticator;
    this.authenticator = builder.authenticator;
    this.connectionPool = builder.connectionPool;
    this.dns = builder.dns;
    this.followSslRedirects = builder.followSslRedirects;
    this.followRedirects = builder.followRedirects;
    this.retryOnConnectionFailure = builder.retryOnConnectionFailure;
    this.connectTimeout = builder.connectTimeout;
    this.readTimeout = builder.readTimeout;
    this.writeTimeout = builder.writeTimeout;
    this.pingInterval = builder.pingInterval;
  }

两种创建方式

创建Request对象

Request用于描述一个HTTP请求,比如请求的方法是"GET"还是"POST",请求的URL,请求的header,请求的body,请求的缓存策略等

//创建一个Request
Request request = new Request.Builder()
        .url(url)
        .build();

创建Call对象

Call是一次HTTP请求的Task,它会执行网络请求以获得响应。OkHttp中的网络请求执行Call既可以同步进行,也可以异步进行。调用call.execute()将直接执行网络请求,阻塞直到获得响应。而调用call.enqueue()传入回调,则会将Call放入一个异步执行队列,由ExecutorService在后台执行。

//new call
Call call = mOkHttpClient.newCall(request); 

执行网络请求并获取响应

同步请求

同步请求会对当前线程产生阻塞,直到请求响应返回

Response response = client.newCall(request).execute();

异步请求

异步请求将提交到线程池中执行

call.enqueue(new Callback(){
    @Override
    public void onResponse(final Response response) throws IOException{
           //String htmlStr =  response.body().string();
    }

    @Override
    public void onFailure(Request request, IOException e) {

    }
});

更多用法请参考 http://www.cnblogs.com/ct2011/p/3997368.html

上一篇下一篇

猜你喜欢

热点阅读