IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> OkHttp源码解析 -> 正文阅读

[移动开发]OkHttp源码解析

阅读源码目标

  1. 了解底层原理,有助于使用API,排查问题
  2. 学习设计模式
  3. 学习系统架构
  4. 面试

功能及原理

功能

  1. 同步请求
  2. 异步请求
  3. WebSocket
  4. 自定义拦截器处理缓存,重定向,请求体管理Bridge,链接管理

核心流程
RealCall 保存了拦截器List

// RealCall.kt
 @Throws(IOException::class)
  internal fun getResponseWithInterceptorChain(): Response {
    val interceptors = mutableListOf<Interceptor>()
    interceptors += client.interceptors
    interceptors += RetryAndFollowUpInterceptor(client)
    interceptors += BridgeInterceptor(client.cookieJar)
    interceptors += CacheInterceptor(client.cache)
    interceptors += ConnectInterceptor
   ......
   }

RealCall 发起请求后构建RealInterceptorChain对象,构造方法传入连接器List和当前访问的Index。

 val chain = RealInterceptorChain(
        call = this,
        interceptors = interceptors,
        index = 0,
    )

执行val response = chain.proceed(originalRequest),该方法会进入到如下逻辑:

// index+1 构建下一个拦截器的RealInterceptorChain对象
    val next = copy(index = index + 1, request = request)
    val interceptor = interceptors[index]

    @Suppress("USELESS_ELVIS")
    val response = interceptor.intercept(next) ?: throw NullPointerException(
        "interceptor $interceptor returned null")

在提供的几种Intercept中会执行自身拦截处理逻辑,调用chain.proceed返回response,将责任链继续传导下去。
整体责任链其实是一个递归模式,假如拦截器List中是ABCD,先执行A的request的处理,再调用chain.proceed,继而执行B的request的处理,直到CD,接下来再从D一步步返回A,处理Response。
在这里插入图片描述
在这里插入图片描述

核心代码

Response getResponseWithInterceptorChain() throws IOException {
    // Build a full stack of interceptors.
    //用来盛放所有的拦截器的
    List<Interceptor> interceptors = new ArrayList<>();
    
    //1. 添加用户定义的拦截器
    interceptors.addAll(client.interceptors());
    //2. 添加一些OkHttp自带的拦截器
    interceptors.add(new RetryAndFollowUpInterceptor(client));
    interceptors.add(new BridgeInterceptor(client.cookieJar()));
    interceptors.add(new CacheInterceptor(client.internalCache()));
    interceptors.add(new ConnectInterceptor(client));
    
    if (!forWebSocket) {
      //这里还有一个网络拦截器,也是可以用户自定义的
      interceptors.addAll(client.networkInterceptors());
    }
    
    //最终访问服务器的拦截器
    interceptors.add(new CallServerInterceptor(forWebSocket));
    
    //3. 将拦截器,当前拦截器索引等传入Interceptor.Chain
    Interceptor.Chain chain = new RealInterceptorChain(interceptors, transmitter, null, 0,
        originalRequest, this, client.connectTimeoutMillis(),
        client.readTimeoutMillis(), client.writeTimeoutMillis());
    
    boolean calledNoMoreExchanges = false;
    try {
      //4. 请求访问下一个拦截器
      Response response = chain.proceed(originalRequest);
      if (transmitter.isCanceled()) {
        closeQuietly(response);
        throw new IOException("Canceled");
      }
      return response;
    } catch (IOException e) {
      calledNoMoreExchanges = true;
      throw transmitter.noMoreExchanges(e);
    } finally {
      if (!calledNoMoreExchanges) {
        transmitter.noMoreExchanges(null);
      }
    }
}

设计模式

建造者模式: client 的build
工厂模式:EventListener.Factory,SocketFactory
责任链模式:简单的说,就是让每个对象都能有机会处理这个请求,然后各自完成自己的事情,一直到事件被处理。Android中的事件分发机制也是用到了这种设计模式。

在这里插入图片描述
一般的责任链模式是ABCD,A保存B的引用,B保存C的,但是Okhttp是保存在list中。

参考

https://blog.csdn.net/heng615975867/article/details/105289872/
https://www.cnblogs.com/jimuzz/p/14536105.html
责任链模式

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:32:44  更:2022-04-09 18:35:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 20:38:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码