• [Network] okhttp3与旧版本okhttp的区别分析


    cp from : https://www.jianshu.com/p/4a8c94b239b4

    1、包名改变

    包名改了由之前的 com.squareup.http.改为 okhttp3.
    我们需要将导包名直接换掉,另外如果代码混淆的话记得修改progurad-rules.pro 文件中将对应包名.

    2、OkHttpClient参数配置

    之前参数可以直接mOkHttpClient.setCache(cache)设置,现在OkHttpClient使用创建者模式,需要在OkHttpClient.Builder上设置可配置的参数如下:

    Dispatcher dispatcher; // 分发  
    Proxy proxy; // 代理  
    List<Protocol> protocols;  
    List<ConnectionSpec> connectionSpecs;  
    final List<Interceptor> interceptors = new ArrayList<>(); // 拦截器
     final List<Interceptor> networkInterceptors = new ArrayList<>(); // 网络拦截器
     ProxySelector proxySelector;  
    CookieJar cookieJar;  
    Cache cache; // 缓存  
    InternalCache internalCache;  
    SocketFactory socketFactory;  
    SSLSocketFactory sslSocketFactory;  
    HostnameVerifier hostnameVerifier;  
    CertificatePinner certificatePinner;  
    Authenticator proxyAuthenticator; // 代理证书  
    Authenticator authenticator; // 证书  
    ConnectionPool connectionPool;  
    Dns dns; // DNS  
    boolean followSslRedirects;  
    boolean followRedirects;  
    boolean retryOnConnectionFailure;  
    int connectTimeout;  
    int readTimeout;  
    int writeTimeout;  
    

      

    例如:
    okhttp3.0之前:

     
    okhttp3.0之后:

    3、OkHttpClient创建方式不同

    okhttp直接new OkHttpClient,而okhttp3中提供了Builder,很好的使用了创建者设计模式.

    4、cookie的设置方式不同:

    okhttp调用OkHttpClient的setCookieHandler方法,CookieHandler是Android SDK提供的标注的cookie管理,CookieHandler的之类CookieManager实现了cookie的具体管理方法,构建CookieManager需要实现CookieStore接口,系统提供了一个默认的实现CookieStoreImpl,只负责把cookie存储在内存中。okhttp3中已经没有setCookieHandler方法了,而改成了cookieJar,新增了Builder,用Builder构建okhttp,设置cookie在Builder的cookieJar方法中设置。
    如下:
    okhttp3 之前用CookieHandler管理cookie,如下:

    /* cookie管理 */   
     mCookieHandler = new CookieManager(null, CookiePolicy.ACCEPT_ALL);   
     mOkHttpClient.setCookieHandler(mCookieHandler);  
    

      

    3.0 之后新增了两个类Cookiejar、Cookie两个类,开放接口,需要用户自己去实现cookie的配管理。用户可以直接在CookieJar中简单设置Cookie的管理,如下:

    okHttpClientBuilder.cookieJar(new CookieJar() {  
           private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();  
                 @Override  
                   public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {  
                     cookieStore.put(url, cookies);  
                    }  
      
                @Override  
                  public List<Cookie> loadForRequest(HttpUrl url) {  
                       List<Cookie> cookies = cookieStore.get(url);  
                       return cookies != null ? cookies : new ArrayList<Cookie>();  
                }  
        }); 
    

      

    5、post消息体构建方式不同

    okhttp使用MultipartBuilderFormEncodingBuilder构建post消息体,最终构建出来的都是RequestBody,而okhttp3增加了RequestBody的子类,构造器放到了RequestBody的子类中,MultipartBody.Builder既可以添加表单数据,也可以添加文件等二进制数据。
    okhttp3.0之前: 

     
     
    okhttp3.0之后:
     
    6、Call和Callback不同

    okhttp的callback方法是

    void onFailure(Request request, IOException e);
    void onResponse(Response response) throws IOException;  
    

      

    okhttp3 的Callback方法有

    void onFailure(Call call, IOException e);
    void onResponse(Call call, Response response) throws IOException;
    

      

    okhttp3对Call做了更简洁的封装,okhttp3 Call是个接口,okhttp的call是个普通class,一定要注意,无论哪个版本,call都不能执行多次,多次执行需要重新创建。

    7、OkHttpClient的Cancel方法去掉

    3.0之前我们去掉call 可以直接使用mOkHttpClient.cancel(tag);
    3.0之后直接阉割掉此方法我们可以采用如下方法:

    public void cancelCallsWithTag(Object tag) {  
            checkInit();  
      
            if (tag == null) {  
                return;  
            }  
      
            synchronized (mOkHttpClient.dispatcher().getClass()) {  
                for (Call call : mOkHttpClient.dispatcher().queuedCalls()) {  
                    if (tag.equals(call.request().tag())) call.cancel();  
                }  
      
                for (Call call : mOkHttpClient.dispatcher().runningCalls()) {  
                    if (tag.equals(call.request().tag())) call.cancel();  
                }  
            }  
        }  

    8、对https支持的不同

    okhttp默认调用了getDefaultSSLSocketFactory方法,该方法提供了默认的SSLSocketFactory,就算不设置SSLSocketFactory也可以支持https,setSslSocketFactory没有做非空判断,如果设置为空,则使用默认的SSLSocketFactory
    okhttp3设置https的方法sslSocketFactory,对SSLSocketFactory做了非空判断,为空会抛出异常。如果不主动设置SSLSocketFactory,okhttp3也提供了默认的http3支持。

    if (builder.sslSocketFactory != null || !isTLS) {  
        this.sslSocketFactory = builder.sslSocketFactory;  
      } else {  
         try {  
          SSLContext sslContext = SSLContext.getInstance("TLS");  
           sslContext.init(null, null, null);  
           this.sslSocketFactory = sslContext.getSocketFactory();  
        } catch (GeneralSecurityException e) {  
           throw new AssertionError(); // The system has no TLS. Just give up.  
        }  
    }  

    作者:闲庭CC
    链接:https://www.jianshu.com/p/4a8c94b239b4
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    【洛谷4657】[CEOI2017] Chase(一个玄学的树形DP)
    Tarjan在图论中的应用(二)——用Tarjan来求割点与割边
    Tarjan在图论中的应用(一)——用Tarjan来实现强连通分量缩点
    jquery放大镜
    自定义上传按钮样式
    一些设计理论资料
    jquery滚动条
    全栈工程师到底有什么用(转)
    巧用CSS文件愚人节恶搞(转)
    仿双色球-随机产生7个数字
  • 原文地址:https://www.cnblogs.com/0616--ataozhijia/p/9044688.html
Copyright © 2020-2023  润新知