okhttp 流程解析,看完就明白系列

本文详细介绍了使用OkHttp进行同步和异步网络请求的过程。包括通过Builder模式创建OkHttpClient和Request对象,利用Call对象发送请求,以及如何处理响应。还深入探讨了Dispatcher、ConnectionPool等组件的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同步请求

//  构建okHttpClient,相当于请求的客户端,Builder设计模式
 OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();
        // 构建一个请求体,同样也是Builder设计模式
        Request request = new Request.Builder().url("http://www.baidu.com").build();
        //  生成一个Call对象,该对象是接口类型
        Call call = okHttpClient.newCall(request);
        try {
            //  拿到Response
            Response response = call.execute();
            Log.i("TAG",response.body().string());
        } catch (IOException e) {
        }

以上就是一个简单的同步请求示例代码,我们来看一看要经过哪些步骤:

1. 通过Builder模式创建OkHttpClient对象和Request对象

2. 调用OkHttpClient的newCall方法,获取一个Call对象,参数是Request

3. 调用execute方法获取一个Respone

知识点:

1 Builder:是OkHttpClient一个静态内部类,在Builder的构造函数中进行了一系列的初始化操作,其中Dispatcher中文是分发器的意思,和拦截器不同的是分发器不做事件处理,只做事件流向。他负责将每一次Requst进行分发,压栈到自己的线程池,并通过调用者自己不同的方式进行异步和同步处理

ConnectionPool:是一个连接池对象,它可以用来管理连接对象,从它的构造方法中可以看到连接池的默认空闲连接数为5个,keepAlive时间为5分钟。

3 Request:请求体,同样也是Builder设计模式,默认get请求方式

4 Call: okhttpclient.newCall方法内部调用了RealCall的newRealCall方法,在newRealCall方法里,完成了RealCall对象的创建,并把它返回出去,Call是一个接口,RealCall是它的实现类

Response:第一步dispatcher 添加请求到runningSyncCalls(同步请求对执行队列)第二步 创建interceptors 集合,以此是 自定义拦截器,重试跟踪拦截器,桥接拦截器,缓存拦截器,连接拦截器,呼叫服务拦截器 做一些相应的操作 返回Response 对象 第三步 dispatcher 将call对象从同步请求消息队列中移除

异步请求

//  构建okHttpClient,相当于请求的客户端,Builder设计模式
 OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();
        // 构建一个请求体,同样也是Builder设计模式
        Request request = new Request.Builder().url("http://www.baidu.com").build();
        //  生成一个Call对象,该对象是接口类型
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {

                    }
                });

简单的看下异步请求的几个步骤:

1. 通过Builder模式创建OkHttpClient对象和Request对象

2. 调用OkHttpClient的newCall方法,获取一个Call对象,参数是Request

3. 调用call对象的enqueue()方法

步骤1和步骤2跟同步请求的步骤一致,主要看一下步骤3

知识点:异步请求和同步请求的步骤1和步骤2一致,都是在做准备工作,并没有发起请求,所以这次我们直接忽略了步骤1和步骤2的分析,直接分析步骤3的源码

  • readyAsyncCalls 是异步请求的就绪队列

  • runningAsyncCalls 是异步请求的执行队

1  调用了Dispatcher的executed方法,将当前的call请求添加到待准备消息队列中去 

把符合条件的call请求从readyAsyncCalls提升为runningAsyncCalls

getResponseWithInterceptorChain()返回Response对象,然后判断retryAndFollowUpInterceptor是否取消回调CallBack接口的onFailure()或onResponse()方法,最后finally中,和同步请求的处理一样,调用了Dispatcher对象的finished()方法。

总结:异步请求中,我们先去遍历异步请求的就绪队列,并判断异步请求的执行队列的队列大小是否小于设置的最大数的时候,如果条件满足,把该请求添加到异步请求的执行队列中去,同时把该请求添加到临时的异步请求的执行队列去中。之后,遍历这个临时的异步请求的执行队列,去执行AsyncCall的execute()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值