Android:OkHttp同步和异步请求流程的理解和使用

OkHttp 请求分发机制

在这里插入图片描述

1、请求操作 Call

在这里插入图片描述
在我们创建请求 Request 后,我们要用 OkHttpClient.newCall() 创建一个 RealCall 对象,然后调用 execute() 发起同步请求或调用 enqueue() 发起异步请求

RealCall 实现了 Call 接口,也是这个接口唯一的实现类,按注释来说,RealCall 是一个 OkHttp 应用与网络层之间的桥梁,该类暴露了高级应用层的原语(primitives):连接、请求、响应与流

你也可以把 RealCall 理解为同步请求操作,而 RealCall 的内部类 AsyncCall 则是异步请求操作

RealCall 中比较中要的两个方法的实现:execute()enqueue()

2、发起同步请求 execute()

当我们调用 RealCall.execute() 发起同步请求时,如果该请求已执行,那么会抛出非法状态异常,所以我们在发起同步请求时要注意捕获异常

在这里插入图片描述
处理流程如下:

1、如果请求没有被执行的话,execute() 方法则会调用 AsyncTimeoutenter() 方法让 AsyncTimeout 做请求超时判断AsyncTimeout 中有一个继承了 Thread 的内部类 WatchDog,而 AsyncTimeout 会用 Object.wait/notify() 阻塞和唤醒 Watchdog 线程

2、当请求超时时,AsyncTimeout 会调用 RealCall 中实现的 timeOut() 方法关闭连接。

3、RealCallexecute() 方法调用完 enter() 方法后,会调用 Dispatcherexecuted() 把请求加入同步请求队列,然后调用 getResponseWithInterceptorChain() 方法获取响应,获取到响应后就会让 Dispatcher 把请求从同步请求队列中移除。

3、发起异步请求 enqueue()

当该请求还没有被执行时,execute() 方法会创建一个异步请求操作 AsyncCall,并把它交给 Dispatcher 处理。
在这里插入图片描述
处理流程如下:

1、AsyncCall 实现了 Runnable 接口,Dispatcher 接收到 AsyncCall 后,会把 AsyncCall 添加到待执行异步请求队列 readyAsyncCalls 中,然后调用自己的 promoteAndExecute() 方法。

2、把 AsyncCall 加入到异步请求队列后,Dispatcher 会看情况决定什么时候执行该异步请求,要执行的时候就会把请求任务提交到线程池 ExecutorService 中。

3、和同步请求一样,在 AsyncCallrun() 方法中做的第一件事情就是让 AsyncTimeout 进入超时判断逻辑,然后用拦截器链获取响应。

在这里插入图片描述
4、当请求的过程中没有遇到异常时,AsyncCallrun() 方法就会调用我们设定的 CallbackonResposne() 回调,如果遇到了异常,则会调用 onFailure() 方法

5、不论异步请求是成功还是失败,RealCall 最后都会调用 Dispatcherfinished() 方法把请求从已运行异步请求队列 runningAsyncCalls 中移除。

参考

1、https://www.jianshu.com/p/5a12ae6d741a

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用OkHttp进行同步请求的代码中,首先需要创建一个OkHttpClient对象。然后,通过构建Request对象指定请求的URL和其他参数。接下来,使用OkHttpClient的newCall()方法创建一个Call对象,并将Request对象作为参数传入。然后,调用Call对象的execute()方法来发送请求并获取服务器的响应。最后,通过response.body().string()方法来获取服务器返回的字符串数据。在代码中,这些步骤都是在子线程中完成的,因为同步请求会阻塞主线程的执行。需要注意的是,网络请求必须在子线程中完成,以避免阻塞主线程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [AndroidOkhttp同步请求与异步请求详解](https://blog.csdn.net/lu202032/article/details/117375167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [AndroidOkhttp3详解(get和post同步异步文件上传)](https://blog.csdn.net/Karl_MIN/article/details/123513993)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值