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

这篇具有很好参考价值的文章主要介绍了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=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);
    }
}

输出结果如下:文章来源地址https://www.toymoban.com/news/detail-693919.html

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

到了这里,关于Android中OkHttp源码阅读二(责任链模式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android OkHttp 源码浅析一

    演进之路:原生Android框架不好用 ---- HttpUrlConnect   和 Apache HTTPClient   第一版  底层使用HTTPURLConnect   第二版 Square构建 从Android4.4开始 基本使用: 同步方法,Deque 双向队列 executableCalls 添加到calls 然后取出遍历 执行 executeOn runningAsyncCalls 正在执行的Call    for (i in 0 until e

    2024年02月11日
    浏览(30)
  • Android OkHttp源码分析--分发器

    OkHttp是当下Android使用最频繁的网络请求框架,由Square公司开源。Google在Android4.4以后开始将源码中 的HttpURLConnection底层实现替换为OKHttp,同时现在流行的Retrofit框架底层同样是使用OKHttp的。 OKHttp优点: 1、支持Http1、Http2、Quic以及WebSocket; 2、连接池复用底层TCP(Socket),减少请求

    2024年02月13日
    浏览(32)
  • Android Okhttp3 分发器源码解析

    在 OkHttp 中,分发器(Dispatcher)是负责调度和执行网络请求的组件。它 管理 着 并发 的 请求数量 以及请求的 优先级 ,确保合理地使用底层的连接池和线程池,从而 提高 网络请求的 效率 和 性能 。 默认情况下,OkHttp 使用一个单例的分发器,它可以处理同时进行的最大请求

    2024年02月12日
    浏览(37)
  • 《Android 移动应用基础教程(Android Studio)(第2版)》【学习笔记】【2023春】【附源码】

    《Android 移动应用基础教程(Android Studio)(第2版)》黑马程序员 源代码 Android——六大基本布局总结/CSDN@小马 同学 【Android】线性布局(LinearLayout)最全解析/CSDN@Teacher.Hu 一个不错的计算器界面👇 Android Studio App LinearLayout多层布局嵌套/CSDN@pythontojava 一个简单的布局👇 Andro

    2024年02月01日
    浏览(31)
  • 下载和阅读Android源码

    源码下载是我们分析源码的开始,Android源码可以全量下载,也可以单个下载。 1.全量下载 官方文档 https://source.android.com/source/downloading ,只要按照上面一步步做就可以了,但是由于需要翻墙,国内无法直接访问,而整个Android项目源码巨大,即便是翻墙后下载也很慢,所以还

    2023年04月08日
    浏览(44)
  • Android源码在线阅读

    ⭐博客同步更新在blogs-index ⭐推荐在github上阅读 推荐几个我在用的Android源码在线阅读网站,方便随时随地学习Android代码。 代码比较齐全,由深圳次元空间网络科技有限公司部署服务。 Project(s) ​ 指定搜索的仓库,select all选择所有的仓库,invert selection对当前选中进行取反操

    2024年02月14日
    浏览(29)
  • 《android源码阅读四》Android系统源码整编、单编并运行到虚拟机

    《安装Ubuntu系统》 《android源码下载》 进入Android源码根目录 初始化环境 清除缓存 选择编译目标 编译 这里的 -j16 是代表编译的时候的线程数,一般是CPU核心数的1~2倍,电脑配置差点,就减少。 等待编译结束,这个过程比较漫长,我的 i5-9400F CPU, 32G 内存,全固态硬盘,编译

    2023年04月25日
    浏览(29)
  • vscode 阅读 android以及kernel 源码

    在Ubuntu系统中安装vscode 参考文档: https://blog.csdn.net/m0_57368670/article/details/127184424 1, 下载vscode https://code.visualstudio.com 2, 安装vscode $ sudo dpkg -i code_1.78.1-1683194560_amd64.deb 3, 打开vscode $ code vscode 阅读 android以及kernel 源码 参考文档: https://blog.csdn.net/lyndon_li/article/details/127955889 sudo

    2024年02月05日
    浏览(41)
  • 第一行代码Android----阅读笔记(UI开发_1)

            在过去,Android应用程序的界面主要是通过编写XML的方式来实现的。写XML的好处是,不仅能够了解界面背后的实现原理,而且编写出来的界面还可以具备很好的屏幕适配性。         不过最近几年,Google又推出了一个全新界面布局: ConstraintLayout 。和以往传统的布局

    2024年01月25日
    浏览(38)
  • Android---OkHttp详解

    OkHttp 是一套处理 HTTP 网络请求的依赖库,由 Square 公司设计研发并开源,目前可以在 Java 和 Kotlin 中使用。对于 Android App,OkHttp 现在几乎已经占据了所有的网络请求操作。 RetroFit + OkHttp 实现网络请求似乎成了一种标配。 因此,它也是每个 Android 开发工程师的必备技能。了解

    2024年01月19日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包