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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

[Network] okhttp3与旧版本okhttp的区别分析相关推荐

  1. WAP1.1、WAP1.2和WAP最新版本WAP2.0区别分析

    现在主要的设备和应用或多或少的遵循WAP 1.1协议.WAP Forum 已经发布了WAP 1.2 ,里面没有太多值得注意的不同.毕竟一个协议不能进化得太快.     总的来说,WAP 1.2中有以下 ...

  2. H3CNE新版本V6.0与旧版本V5.1的区别

    H3CNE新版本V6.0与旧版本V5.1的区别 华×××司于09年3月份推出了自己的新版NE培训教材V6.0版本,考试代号为GB0-190,考试价格也由原来的340元上涨到了1000元.通过分数线为6 ...

  3. picsart旧版本_PicsArt历史版下载

    PicsArt旧版本是一款非常好用的手机照片编辑软件,那么中科院软件有着强大的编辑功能,拍照功能,想要你拍摄的照片有着很大的区别吗,那么快来下载这款软件使用吧. 软件介绍 人人都可成为艺术家!Pics ...

  4. Eclipse 版本升级:如何不卸载旧版本 Eclipse 实现在线升级到最新版本?

    文章目录 前言 一.网上没"升级 Eclipse"相关资料吗? 1.1.相关资料很少,我也生气 1.2.升级新版本与在线升级插件傻傻搞不清 二.版本升级准备 2.1.Eclipse ...

  5. Android各个版本API的区别

    Android各个版本API的区别 Android 1.5 API变更概要: 1.UI framework · Framework for easier background/UI thread in ...

  6. 执行RMAN恢复的高级场景_还原使用旧版本的RMAN创建的备份

    可以还原使用旧版本直到Oracle Database 9i Release 2(9.2.0.8)的RMAN创建的备份. 在创建备份的Oracle数据库版本和运行还原的数据库的Oracle软件版本之间必 ...

  7. 苹果ll是什么版本_新的iPad Pro和旧版本有什么区别?苹果背后的策略是什么?...

    - 本期词汇 - Notch - 刘海 Augmented Reality - 增强现实 chip - 芯片 benchmark - 跑分 performance - 性能 hardware - 硬件 ...

  8. pandas python2.3版本_应该学习最新版本的 Python 3 还是旧版本的 Python 2?

    应该学习最新版本的 Python 3 还是旧版本的 Python 2? 看到最新Python版本是3.4,但是网上的资料,包括出版的书籍,都是最晚到13年左右,很多细节都不同,语法也过时了. 那此时应 ...

  9. Mcafee两个Mac版本之间的区别

    近期打算为Mac安装个杀毒软件,由于自己windows平台下用的是VSE,所以Mac平台也首选Mcafee家的东西了. 到Mcafee官网下载点一看,有以下几个版本可以用在Mac上: 有点懵了,查看了 ...

  10. picsart旧版本_picsart2017旧版本

    picsart2017旧版本是picsart最好用的版本系列,虽然现在已经更新了许多版本,不过不少用户还是喜欢2017年的老版本,小编为大家找到了picsart2017旧版本,喜欢的用户不要错过哦! ...

最新文章

  1. js判断是由含有a节点_怎么判断某个dom节点是否包含某个dom节点?
  2. K8S部署Kuboard V3
  3. MY MOBILER v1.23 - 类似SOTI Pocket Controller的免费工具
  4. android布局DSL,android – 使用自定义Anko布局DSL解除警报对话框
  5. LLVM每日谈之十二 LLVM的源码分析之Pass相关
  6. ntnub原理怎么看_电锤只转不冲击怎么回事?看懂了工作原理,你也可以动手解决...
  7. 想辞职专心做自媒体可以吗?有哪些建议吗?
  8. 本地计算机上的MSSQLSERVER服务启动后又停止了。一些服务自动停止,如果它们没有什么可做的,例如“性能日志和警报“服务。...
  9. Linux电源管理-Operating Performance Points(OPP)
  10. 易语言新手入门教程第十三课 - 制作QQ自动登录器
  11. 卡尔曼滤波与扩展卡尔曼滤波(EKF)
  12. 鹿鼎记 · 韦小宝,丽春院、天地会、入皇宫等五个场景的恶搞版多线程锁学习!
  13. Java8 新特性之流式数据处理
  14. 听风的插件-正在战斗中
  15. 梳理19年上半年图文记录笔记(ios篇)
  16. java学习(类和对象)
  17. [代码审计]Weiphp5.0 前台文件任意读取分析
  18. 苹果推出iPhone 12维修计划,解决无声音问题
  19. MAX31856 高精度热电偶至数字输出转换器开发笔记
  20. 工业相机分辨率怎么选择

热门文章

  1. git---怎样将分支上的一个单文件合并到主分支上(master)
  2. Chrome 开发者工具(DevTools)中所有快捷方式列表
  3. CentOS 5.4 安装和卸载桌面
  4. memcached SASL验证状态安全绕过漏洞
  5. (最新版2020)Java环境变量配置
  6. 牛客网暑期ACM多校训练营(第四场)G Maximum Mode(思维)
  7. Arduino学习笔记6
  8. php部分---注册审核
  9. C# 获取所有网卡信息
  10. 启动工程Ehcache报错