Android高工面试被问OKHTTP内核解析,我慌了!,2024Android架构面试指南

  1. }

  2. });

第二步:代码流程分析:

  1. Request request = new Request.Builder().url("url").build();

初始化构建者模式和请求对象,并且用URL替换Web套接字URL。

  1. public final class Request {

  2. public Builder() {

  3. this.method = "GET";

  4. this.headers = new Headers.Builder();

  5. }

  6. public Builder url(String url) {

  7. ......

  8. // Silently replace web socket URLs with HTTP URLs.

  9. if (url.regionMatches(true, 0, "ws:", 0, 3)) {

  10. url = "http:" + url.substring(3);

  11. } else if (url.regionMatches(true, 0, "wss:", 0, 4)) {

  12. url = "https:" + url.substring(4);

  13. }

  14. HttpUrl parsed = HttpUrl.parse(url);

  15. ......

  16. return url(parsed);

  17. }

  18. public Request build() {

  19. ......

  20. return new Request(this);

  21. }

  22. }

第三步:方法解析:

  1. okHttpClient.newCall(request).enqueue(new Callback() {

  2. @Override

  3. public void onFailure(Call call, IOException e) {

  4. }

  5. @Override

  6. public void onResponse(Call call, Response response) throws IOException {

  7. }

  8. });

源码分析:

  1. public class OkHttpClient implements Cloneable, Call.Factory, WebSocket.Factory {

  2. @Override

  3. public Call newCall(Request request) {

  4. return new RealCall(this, request, false /* for web socket */);

  5. }

  6. }

RealCall实现了Call.Factory接口创建了一个RealCall的实例,而RealCall是Call接口的实现。

异步请求的执行流程

  1. final class RealCall implements Call {

  2. @Override

  3. public void enqueue(Callback responseCallback) {

  4. synchronized (this) {

  5. if (executed) throw new IllegalStateException("Already Executed");

  6. executed = true;

  7. }

  8. captureCallStackTrace();

  9. client.dispatcher().enqueue(new AsyncCall(responseCallback));

  10. }

  11. }

由以上源码得知:

1) 检查这个 call 是否已经被执行了,每个 call 只能被执行一次,如果想要一个完全一样的 call,可以利用 call#clone 方法进行克隆。

2)利用 client.dispatcher().enqueue(this) 来进行实际执行,dispatcher 是刚才看到的 OkHttpClient.Builder 的成员之一

3)AsyncCall是RealCall的一个内部类并且继承NamedRunnable,那么首先看NamedRunnable类是什么样的,如下:

  1. public abstract class NamedRunnable implements Runnable {

  2. ......

  3. @Override

  4. public final void run() {

  5. ......

  6. try {

  7. execute();

  8. }

  9. ......

  10. }

  11. p

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值