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

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

👉点击跳转到教程

Android OkHttp源码阅读详解一

c 复制代码
看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

c 复制代码
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,这里只写一个其它三个同理

c 复制代码
public class Task1 extends BaseTask {
    public Task1(boolean isTask) {
        super(isTask);
    }

    @Override
    public void doActon() {
        //执行子节点
        System.out.println("Task1 任务节点一 执行了");
    }
}

3、定一个Test类进行测试

c 复制代码
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();
    }
}

输出结果:

c 复制代码
Task3  任务节点三 执行了

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

1.首先定义一个接口

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

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

c 复制代码
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

c 复制代码
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);
        }
    }
}
c 复制代码
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);
        }
    }
}
c 复制代码
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类进行测试

c 复制代码
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);
    }
}

输出结果如下:

c 复制代码
拦截器任务节点2 处理了...
相关推荐
墨天梦3 小时前
B17_LifecycleLiveData与Flow
android·kotlin
_祝你今天愉快5 小时前
UI核心 - 绘制流程(测量、布局、绘制)
android
冬奇Lab6 小时前
LLM 驱动的自动化测试系列(07):移动端自动化(三)——Mobile-Agent-v3 与自研 GUI-Owl 模型路线
android·人工智能·测试
leobertlan9 小时前
痛苦系列 | DSP-02 频域切片:DTFT与DFT的探索
android·后端
leobertlan10 小时前
痛苦系列 | DSP-01 从连续到离散:DSP基础与采样
android·后端
事圆则缓12 小时前
Android 视频压缩上传实战:从 content Uri、转码到断点续传
android
冉冉同学15 小时前
AI Agent 开始操作真实手机:移动端自动化的 3 个新考点
android·ai编程
帅得不敢出门16 小时前
Android Framework关闭软件低电关机功能测试PMIC低电保护
android
恋猫de小郭16 小时前
Flutter + EmbeddingGemma 2,谷歌发布完全端侧的 AI Edge Foresight
android·前端·flutter
墨天梦17 小时前
B15_HTTP解析与OkHttp拦截器
网络协议·http·okhttp