OkHttp之工作流程

本文详细介绍了OkHttp的工作流程,包括Call的创建、同步请求和异步请求的方式。同步请求会阻塞当前线程,通常在子线程中执行,而异步请求则通过异步任务调度实现。OkHttp使用双端队列存储任务,并通过Executor进行并发管理,确保网络请求的高效执行。
摘要由CSDN通过智能技术生成

OkHttpSquare开源框架之一,想必大家对它都很熟悉。它有同步及异步两种请求数据方式,具体使用如下。

  public static void main(String... args) throws Exception {
   
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
        .url(url)
        .build();
    //采用同步方式请求数据
    Response response = client.newCall(request).execute();
    //采用异步方式请求数据 
    client.newCall(request).enqueue(new Callback() {
   
      @Override
      public void onFailure(Call call, IOException e) {
   }

      @Override
      public void onResponse(Call call, Response response) throws IOException {
   }
    }); 
  }
1、Call的创建

 在OkHttp中,每一个请求对应着一个Call,它是一个接口,具体实现在RealCall中。我们通过client.newCall(request)就可以创建一个RealCall对象,同步及异步请求就是通过RealCallexecuteenqueue这两个方法来实现的。

  @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.transmitter = new Transmitter(client, call);
    return call;
  }
2、同步请求

 通过client.newCall(request).execute()这样一句代码就可以从网络请求数据,是不是很简单,下面就来梳理它的实现。

  @Override public Response execute() throws IOException {
   
    //每个Call对应着一次请求,只能在同一Call对象内调用一次本方法
    synchronized (this) {
   
      if (executed) throw new IllegalStateException("Already Executed");
      executed = true;
    }
    captureCallStackTrace();
    //Okio读写数据超时监听,防止一直阻塞,由于设置的值为0,所以timeout会一直运行下去除非抛异常
    timeout.enter();
    transmitter.callStart();
    try {
   
      //添加到请求队列中
      client.dispatcher().executed(this);
      //进行数据请求并返回
      Response result = getResponseWithInterceptorChain();
      //如果Response为空则抛异常
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值