当前位置: 首页 > news >正文

Android中OkHttp源码阅读二(责任链模式)

博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家
👉点击跳转到教程

Android OkHttp源码阅读详解一

看OkHttp源码,发现OkHttp里面使用了责任链设计模式,所以才要学习责任链设计模式  小节2
最终会返回Response
Response getResponseWithInterceptorChain() throws IOException {// Build a full stack of interceptors.List<Interceptor> interceptors = new ArrayList<>();interceptors.addAll(client.interceptors());interceptors.add(retryAndFollowUpInterceptor);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));Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,originalRequest, this, eventListener, client.connectTimeoutMillis(),client.readTimeoutMillis(), client.writeTimeoutMillis());return chain.proceed(originalRequest);}chain包下的案例 熟悉责任链模式
chain2包下的案例 对应OkHttp源码中的责任链模式getResponseWithInterceptorChain()阅读OkHttp源码的总结
1.OSI七层模型,TCP/IP参考模型,HTTP格式
2.我们阅读了OkHttp源码的主线流程
3.我们阅读了OkHttp源码缓存方案的线程池
4.我们阅读了OkHttp源码,发现了构建者设计模式,责任链模式

一、首先写一个案例熟悉责任链模式

1、定义一个抽象类BaseTask

public abstract class BaseTask {//判断当前任务节点,有没有能力执行private boolean isTask;public BaseTask(boolean isTask) {this.isTask = isTask;}//执行下一个节点private BaseTask nextTask; //t2,t3//添加下一个节点任务public void addNextTask(BaseTask nextTask) {this.nextTask = nextTask;}//让子节点任务去完成的public abstract void doActon();//动作public void action() { //t1=false  t2=false,t3=trueif (isTask) {doActon(); //执行子节点 链条就断了} else {//继续执行下一个任务节点if (nextTask != null) {nextTask.action();}}}
}

2、定义四个Task类,都继承自BaseTask,这里只写一个其它三个同理

public class Task1 extends BaseTask {public Task1(boolean isTask) {super(isTask);}@Overridepublic void doActon() {//执行子节点System.out.println("Task1 任务节点一 执行了");}
}

3、定一个Test类进行测试

public class Test {public static void main(String[] args) {Task1 task1 = new Task1(false);Task2 task2 = new Task2(false);Task3 task3 = new Task3(true);Task4 task4 = new Task4(false);task1.addNextTask(task2);task2.addNextTask(task3);task3.addNextTask(task4);//执行第一个任务节点task1.action();}
}

输出结果:

Task3  任务节点三 执行了

二、写一个案例熟悉责任链模式,对应OkHttp源码中的责任链模式getResponseWithInterceptorChain()

1.首先定义一个接口

public interface IBaseTask {/*** @param isTask    任务节点是否有人执行* @param iBaseTask 下一个任务节点*/void doRunAction(String isTask, IBaseTask iBaseTask);
}

2.定义一个链条管理类ChainManager

public class ChainManager implements IBaseTask {private List<IBaseTask> mIBaseTaskList = new ArrayList<>();private int index = 0;public void addTask(IBaseTask iBaseTask) {mIBaseTaskList.add(iBaseTask);}@Overridepublic void doRunAction(String isTask, IBaseTask iBaseTask) {if (mIBaseTaskList.isEmpty()) {//抛出异常return;}if (index >= mIBaseTaskList.size()) {return;}IBaseTask iBaseTaskResult = mIBaseTaskList.get(index);//t1index++;iBaseTaskResult.doRunAction(isTask, iBaseTask);}
}

3.定义三个Task1,Task2,Task3

public class Task1 implements IBaseTask {@Overridepublic void doRunAction(String isTask, IBaseTask iBaseTask) {if ("no".equals(isTask)) {System.out.println("拦截器任务节点1 处理了...");return;} else {iBaseTask.doRunAction(isTask, iBaseTask);}}
}
public class Task2 implements IBaseTask {@Overridepublic void doRunAction(String isTask, IBaseTask iBaseTask) {if ("ok".equals(isTask)) {System.out.println("拦截器任务节点2 处理了...");return;} else {iBaseTask.doRunAction(isTask, iBaseTask);}}
}
public class Task3 implements IBaseTask {@Overridepublic void doRunAction(String isTask, IBaseTask iBaseTask) {if ("no".equals(isTask)) {System.out.println("拦截器任务节点3 处理了...");return;} else {iBaseTask.doRunAction(isTask, iBaseTask);}}
}

4、定义一个Test类进行测试

public class Test {public static void main(String[] args) {ChainManager chainManager = new ChainManager();chainManager.addTask(new Task1());chainManager.addTask(new Task2());chainManager.addTask(new Task3());chainManager.doRunAction("ok", chainManager);}
}

输出结果如下:

拦截器任务节点2 处理了...

相关文章:

Android中OkHttp源码阅读二(责任链模式)

博主前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住也分享一下给大家 &#x1f449;点击跳转到教程 Android OkHttp源码阅读详解一 看OkHttp源码&#xff0c;发现OkHttp里面使用了责任链设计模式&#xff0c;所以才要学习…...

2023年03月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:波兰表达式 波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的波兰表示法为+ 2 3。波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的波兰表示法为* + 2 3 4。本题求解…...

顺序表链表OJ题(1)——【LeetCode】

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 前言&#xff1a; 今天我们来回顾一下顺序表与链表&#xff0c;针对这一块我们也有许多OJ题目供大家参考。当我们学习完顺序表链表后避免不了一些习题的练习&#xff0c;这样才能巩固我们学习的内容。 话不多说&#xf…...

flex:1

问题1&#xff1a;“flex: 1” 与其他 “flex” 值有何区别&#xff1f; 答案&#xff1a; “flex: 1” 是 “flex” 属性的一种简写形式&#xff0c;它将 “flex-grow”、“flex-shrink” 和 “flex-basis” 设置为特定的值。与其他 “flex” 值相比&#xff0c;“flex: 1” …...

iOS练手项目知识点汇总

基础理解篇 Objective-C是一种面向对象的编程语言&#xff0c;它支持元编程。元编程是指编写程序来生成或操纵其他程序的技术。 Objective-C中&#xff0c;元编程可以使用Objective-C的动态特性来实现。例如可以使用Objective-C的运行时函数来动态地创建类、添加属性和方法等等…...

【Linux】Libevent相关小知识总结

Libevent是基于事件的&#xff0c;也就是说&#xff0c;相当于去注册一个事件&#xff0c;当这个事件发生的话&#xff0c;那么就会调用回调函数。...

【Spring Security】UserDetailsService 接口介绍

文章目录 UserDetailsService 介绍UserDetailsService 具体操作UserDetailsService 方法介绍 UserDetailsService 介绍 UserDetailsService 在 Spring Security 中主要承担查询系统内用户、验证密码、封装用户信息和角色权限。大白话就是你写一个实现类实现 UserDetailsServic…...

Mybatis学习|日志工厂、分页

1.日志工厂 如果一个数据库操作&#xff0c;出现了异常&#xff0c;我们需要排错。日志就是最好的助手! 曾经: sout、debug 现在:日志工厂! 我们主要掌握STDOUT_LOGGING 和LOG4j 在Mybatis中具体使用哪个一日志实现&#xff0c;在设置中设定! 在mybatis核心配置文件中&#…...

Vivado 添加FPGA开发板的Boards file的添加

1 digilent board file 下载地址 下载地址 &#xff1a; https://github.com/Digilent/vivado-boards 2 下载后 3 添加文件到 vivado 安装路径 把文件复制到 Vivado\2019.1\data\boards\board_files4 创建工程查看是否安装成功...

vmstat

vmstat VirtualMeomoryStatistics&#xff0c;虚拟内存统计&#xff0c;是Linux中监控内存的常用工具&#xff0c;可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。 [rootwenzi wenzi]# vmstat procs -----------memory---------- ---swap-- -----io---- -system--…...

LinuxShell变量

变量&#xff1a; 命名规则&#xff1a; 在Shell中&#xff0c;变量名可以由字母、数字或者下划线组成&#xff0c;并且只能以字母或者下划线开头。对于变量名的长度&#xff0c;Shell并没有做出明确的规定。因此&#xff0c;用户可以使用任意长度的字符串来作为变量名。但是…...

如何实现的手机实景自动直播,都有哪些功能呢?

手机实景自动直播最近真的太火了&#xff0c;全程只需要一部手机&#xff0c;就能完成24小时直播带货&#xff0c;不需要真人出镜&#xff0c;不需要场地&#xff0c;不需要搭建直播间&#xff0c;只需要一部手机就可以了。真人语音讲解&#xff0c;真人智能回复&#xff0c;实…...

如何让qt tableView每个item中个别字用不同颜色显示?

如何让qt tableView每个item中个别字用不同颜色显示&#xff1f; 从上面图片可以看到&#xff0c;Item为红色&#xff0c;数字5为黑色。 要实现在一个控件实现不同颜色&#xff0c;目前想到的只有QTextEdit 、QLabel。有两种方法&#xff0c;第一种是代理&#xff0c;第二种是…...

Aspose导出word使用记录

背景&#xff1a;Aspose系列的控件&#xff0c;功能实现都比较强大&#xff0c;可以实现多样化的报表设计及输出。 通过这次业务机会&#xff0c;锂宝碳审核中业务功需要实现Word文档表格的动态导出功能&#xff0c;因此学习了相关内容&#xff0c;在学习和参考了官方API文档的…...

[Java]_[初级]_[使用SAX流的方式写入XML文件]

场景 文件的写入目前没有发现可以增量写入的&#xff0c;只能是完全重新写入。对于大量数据需要写入XML文件&#xff0c;还是和读XML文件一样&#xff0c;不需要生成DOM模型能节省不少的内存和指令。 说明 在java标准库里&#xff0c;也是有相关的SAX类来写入数据流&#xf…...

java里面封装https请求工具类

1.工具类如下 Component Slf4j public class RestClientUtil<T> {private final RestTemplate restTemplate;public RestClientUtil() {this.restTemplate new RestTemplate();}public JSONObject uploadFile(String url, String fileUrl) throws IOException {List<…...

uniApp常见面试题-附详细答案

uniApp中如何进行页面跳转&#xff1f; 答案&#xff1a;可以使用uni.navigateTo、uni.redirectTo和uni.reLaunch等方法进行页面跳转。其中&#xff0c;uni.navigateTo可以实现页面的普通跳转&#xff0c;uni.redirectTo可以实现页面的重定向跳转&#xff0c;uni.reLaunch可以实…...

Java“牵手”1688整店商品API接口数据,通过店铺ID获取整店商品详情数据,1688店铺所有商品API申请指南

1688平台店铺所有商品数据接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取1688整店的商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、价格信息等详细信息 。 获取店铺所有商品接口API是一种用于获取电商平台上商品详…...

数据进制的转换

其他进制转换为十进制 通过按权展开法转换 十进制转换为其他进制 通过短除法转换&#xff08;注意计算结果是倒着的&#xff09; 例如将十进制的94转换为二进制 二进制转八进制和十六进制 3位二进制数表示1位八进制数&#xff0c;4位二进制数表示1位十六进制数 同理八进制数…...

如何分析识别文章/内容中高频词和关键词?

theme: orange 要分析一篇文章的高频词和关键词&#xff0c;可以使用 Python 中的 nltk 库和 collections 库或者jieba库来实现&#xff0c;本篇文章介绍基于两种库分别实现分析内容中的高频词和关键词。 nltk 和 collections 库 首先&#xff0c;需要安装 nltk 库和 collectio…...

Windows7安装SSH客户端的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

力扣:81. 搜索旋转排序数组 II(Python3)

题目&#xff1a; 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转 &#xff0c;使数组变为 [nums[k], nums[k1], .…...

TCP IP网络编程(三) 地址族与数据序列

文章目录 分配给套接字的IP地址与端口号网络地址网络地址分类与主机地址边界 地址信息的表示表示 IPv4地址的结构体结构体sockaddr_in 的成员分析 网络字节序与地址变换字节序与网络字节序字节序转换 网络地址的初始化与分配将字符串信息转换为网络字节序的整数型网络地址初始化…...

对比Flink、Storm、Spark Streaming 的反压机制

分析&回答 Flink 反压机制 Flink 如何处理反压? Storm 反压机制 Storm反压机制 Storm 在每一个 Bolt 都会有一个监测反压的线程&#xff08;Backpressure Thread&#xff09;&#xff0c;这个线程一但检测到 Bolt 里的接收队列&#xff08;recv queue&#xff09;出现了…...

Ubuntu常用配置集合

Ubuntu配置软件镜像源 参考文章&#xff1a;Ubuntu如何配置软件镜像源 建议使用清华的源。 Ubuntu安装SSH服务&#xff1a; 参考文章&#xff1a;Ubuntu安装SSH服务 ubuntu下安装使用nvm 参考文章&#xff1a;ubuntu下安装使用nvm 出现下载sh文件不成功的情况&#xff0c;…...

传统三维重建和深度学习三维重建 MVS笔记总结、问题总结

什么是cost-volume ?(代价体) 什么是置信度?置信区间? pixel-wise,patch-wise,image-wise的区别 图像 4领域-8领域-16领域 及代码实现 文章目录 1 plane-sweeping2 传统三维重建深度学习三维重建有何不同呢?3 大型场景重建4 PMVS-精确、密集、鲁棒的多视图立体视觉…...

Ansible学习笔记10

1、在group1的被管理机里的mariadb里创建一个abc库&#xff1b; 1&#xff09; 然后我们到agent主机上进行检查&#xff1a; 可以看到数据库已经创建成功。 再看几个其他命令&#xff1a; #a组主机重启mysql&#xff0c;并设置开机自启 ansible a -m service -a "namemy…...

肖sir__linux详解__002(系统命令)

linux系统命令 1、df 查看磁盘使用情况 &#xff08;1&#xff09;df 查看磁盘使用情况&#xff08;按kb单位显示&#xff09; &#xff08;2&#xff09;df -h 按单位显示磁盘使用情况 2、top 实时查看动态进程 &#xff08;1&#xff09;top 详解&#xff1a; 第一行&…...

AI绘画:StableDiffusion实操教程-斗罗大陆2-江楠楠-常服(附高清图下载)

前段时间我分享了StableDiffusion的非常完整的教程&#xff1a;“AI绘画&#xff1a;Stable Diffusion 终极宝典&#xff1a;从入门到精通 ” 尽管如此&#xff0c;还有读者反馈说&#xff0c;尽管已经成功安装&#xff0c;但生成的图片与我展示的结果相去甚远。真实感和质感之…...

JavaScript运行机制与实践应用

一、JavsScript运行机制 1、JavaScript 是一种解释型语言&#xff0c;它的执行机制主要包括以下几个步骤&#xff1a; 2、事件循环 3、JavaScript运行模型 4、JavaScript任务 5、JavaScript宏任务和微任务 6、案例分析 console.log(script start) setTimeout(function () {co…...