OkHttp基本原理浅析

本文深入分析了OkHttp的基本原理,包括同步和异步请求的执行过程。同步请求直接在当前线程执行,异步请求则通过Dispatcher分发到线程池。文中详细解释了Dispatcher的线程池管理和任务调度,以及AsyncCall如何在执行中调用RealCall的execute方法。此外,文章还探讨了OkHttp中的拦截器机制,展示了如何形成责任链并逐个处理请求。
摘要由CSDN通过智能技术生成

OkHttp基本原理浅析

我们先来看下OkHttp的两个使用方法
同步:

   //同步执行方法,不应该在UI线程使用
    response = client.newCall(request).execute();
    //异步方法    
    response = client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

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

                }
            }
        });

让我们进入newCall一探究竟~


    /**
     * Prepares the {@code request} to be executed at some   * point in the future.
     */
     @Override public Call newCall(Request request) {
     return RealCall.newRealCall(this, request, false /* for web socket */);
    }

    static RealCall newRealCall(OkHttpClient client, Request originalRequest, boolean forWebSocket) {
    // Safely publish the Call instance to the EventListener.
    RealCall call = new RealCall(client, originalRequest, forWebSocket);
    call.eventListener = client.eventListenerFactory().create(call);
    return call;
    }

可以看到返回了一个RealCall对象,接下来继续看RealCall是个什么东西,主要看他的 execute和enqueue方法

  @Override protected void execute() {
      boolean signalledCallback = false;
      try {
        Response response = getResponseWithInterceptorChain();
        if (retryAndFollowUpInterceptor.isCanceled()) {
          signalledCallback = true;
          responseCallback.onFailure(RealCall.this, new IOException("Canceled"));
        } else {
          signalledCallback = true;
          responseCallback.onResponse(RealCall.this, response);
        }
      } catch (IOException e) {
        if (signalledCallback) {
          // Do not signal the callback twice!
          Platform.get().log(INFO, "Callback failure for " + toLoggableString(), e);
        } else {
          eventListener.callFailed(RealCall.this, e);
          responseCallback.onFailure(RealCall.this, e);
        }
      } finally {
        client.dispatcher().finished(this);
      }
    }
    }

由此可见execute确实是执行在调用它的线程里面的,看代码应该是通过getResponseWithInterceptorChain()来具体执行的,看到了似曾相识的interceptor,其实这里是运用了责任链设计模式的拦截器,这个稍后再说 execute方法暂时先告一段落,接下来看enqueue

   @Override 
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值