首页 > 编程语言 >Android中OkHttp源码阅读二(责任链模式)

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

时间:2023-09-30 19:31:51浏览次数:34  
标签:iBaseTask void 节点 源码 new OkHttp isTask Android public


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=true
        if (isTask) {
            doActon(); //执行子节点 链条就断了
        } else {
            //继续执行下一个任务节点
            if (nextTask != null) {
                nextTask.action();
            }
        }
    }
}

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

public class Task1 extends BaseTask {
    public Task1(boolean isTask) {
        super(isTask);
    }

    @Override
    public 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);
    }

    @Override
    public void doRunAction(String isTask, IBaseTask iBaseTask) {
        if (mIBaseTaskList.isEmpty()) {
            //抛出异常
            return;
        }
        if (index >= mIBaseTaskList.size()) {
            return;
        }
        IBaseTask iBaseTaskResult = mIBaseTaskList.get(index);//t1
        index++;
        iBaseTaskResult.doRunAction(isTask, iBaseTask);
    }
}

3.定义三个Task1,Task2,Task3

public class Task1 implements IBaseTask {
    @Override
    public 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 {
    @Override
    public 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 {
    @Override
    public 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 处理了...


标签:iBaseTask,void,节点,源码,new,OkHttp,isTask,Android,public
From: https://blog.51cto.com/u_15880918/7664970

相关文章

  • qemu源码分析(9)--Apple的学习笔记
    一, 前言本章节主要是再把GPIO创建的内容进行细化,搞明白gpio是否一个object,还和其它什么内容有关。二,分析 GPIOA,GPIOB等包括他们的寄存器都是object。每个对象都会再object_new的时候分配空间,比如GPIOA和GPIOB都有自己的空间。创建GPIOA,主要包括创建goio-peripheral类型及在conta......
  • 解决Android studio 更新到2022.3版本后,一直卡在waiting for target device to come o
    解决Androidstudio更新到2022.3.1patch1之后卡在waitingfortargetdevicetocomeonline的问题1.现象在发布一个app的时候,每次走到waitingforalltargetdevicestocomeonline之后,就没有后续了,模拟器没有调起来,更不用谈后续的install。2.原因暂时不明3.解决方法......
  • 6. 用Rust手把手编写一个wmproxy(代理,内网穿透等), 通讯协议源码解读篇
    用Rust手把手编写一个wmproxy(代理,内网穿透等),通讯协议源码解读篇项目++wmproxy++gite:https://gitee.com/tickbh/wmproxygithub:https://github.com/tickbh/wmproxy事件模型的选取OS线程,简单的一个IO对应一个系统级别的线程,通常单进程创建的线程数是有限的,在线程与......
  • Vue源码学习(八):生命周期调用
    好家伙, Vue源码学习(七):合并生命周期(混入Vue.Mixin)书接上回,在上一篇中,我们已经实现了合并生命周期现在,我们要在我们的初始化过程中,注册生命周期 1.项目目录 红框为本篇涉及到的.js文件 2.先来看/utils/index.jsexportconstHOOKS=["beforeCreated......
  • Android GreenDao数据库使用
    GreenDao介绍GreenDao是一个开源的AndroidORM嵌入式关系数据库,通过将Java对象映射到数据库表(称为ORM,“对象/关系映射”),使用一个简单的面向对象的API来存储、更新、删除和查询Java对象。GreenDao特点●最佳性能(可能是Android中最快的ORM),基准测试也是开源的;●......
  • 开源药店商城系统源码比较:哪个适合你的药品电商业务
    在构建药品电商业务时,选择适合的药店商城系统源码是至关重要的决策之一。开源药店商城系统源码提供了快速入门的机会,但在选择之前,您需要仔细考虑您的需求、技术要求和可扩展性。本文将比较几个流行的开源药店商城系统源码,以帮助您找到最适合您业务的选项。1.MagentoMagento是一个......
  • 小程序获取源码
    1.获取加密的小程序文件进入文件夹 选择:Applet文件夹   根据第一次使用小程序的时间,选择目标小程序 找到wxapkg文件    使用工具解密小程序 解密后的文件,放入反编译工具 使用工具反编译,后查找Js文件,查找加解密方式。  https://githu......
  • 解决adb connect 连接Android设备报错:由于目标计算机积极拒绝,无法连接
    1.手机打开开发者模式,然后打开USB调试2.使用USB数据线连接手机和电脑3.在PC端打开cmd命令窗口,输入adbdevices,可以看到已经连接的设备4.输入adbtcpip8888(设置端口号为8888)5.断开手机和电脑的连接adbconnectIP ......
  • 【Android 开发】 面试官喜欢一直问到底?教你如何避免翻车沟通表达能力
    在信息爆炸的时代,Android开发领域的知识日新月异,如何提升自己的能力和找到适合自己的学习资源是一个常见的问题。自我介绍是面试的必备环节之一时长通常在三分钟以内。在自我介绍时,候选人应该简明扼要地介绍自己的经历和能力,突出自己的优势和特点,以及为什么适合这个职位。基础知识......
  • 国外盲盒系统源码系统开发
      盲盒系统源码系统开发  盲盒系统定制开发,有多种玩法模式,可以是开箱,也可以是商城模式,它是以用户在商城购买盲盒,直接开箱。不知道如何选择盲盒可以玩随机的模式,输入自己想要东西,用户在选择他们想要的商品时,系统也会尽可能的满足的,系统会随机选择一个物品放入盲盒中,然后将......