OKHttp

发布时间 2023-04-11 15:36:54作者: 懒懒初阳

OkHttp默认使用长连接(HTTP Keep-Alive)来复用TCP连接,以减少多次握手建立连接的时间和资源浪费。

常用方法如下:
1.创建OkHttpClient对象

    OkHttpClient client = new OkHttpClient();

2.创建Request对象

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

3.发送请求并获取响应

    Response response = client.newCall(request).execute();
    if (response.isSuccessful()) {
        String result = response.body().string();
    }

4.设置超时时间

  OkHttpClient client = new OkHttpClient().newBuilder()
          .connectTimeout(10, TimeUnit.SECONDS)//连接超时时间
          .writeTimeout(10, TimeUnit.SECONDS)//写入超时时间
          .readTimeout(30, TimeUnit.SECONDS)//读取超时时间
          .build();

5.异步请求

  client.newCall(request).enqueue(new Callback() {
      @Override
      public void onFailure(Call call, IOException e) {
          //请求失败
      }

      @Override
      public void onResponse(Call call, Response response) throws IOException {
          if (response.isSuccessful()) {
              String result = response.body().string();
          }
      }
  });

6.发送POST请求

  RequestBody requestBody = new FormBody.Builder()
          .add("param1", "value1")
          .add("param2", "value2")
          .build();

  Request request = new Request.Builder()
          .url(url)
          .post(requestBody)
          .build();

  Response response = client.newCall(request).execute();

7.发送文件

  File file = new File(Environment.getExternalStorageDirectory(), "test.txt");
  RequestBody requestBody = new MultipartBody.Builder()
          .setType(MultipartBody.FORM)
          .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("application/octet-stream"), file))
          .build();

  Request request = new Request.Builder()
          .url(url)
          .post(requestBody)
          .build();

  Response response = client.newCall(request).execute();

8.取消请求

	Call call = client.newCall(request);
	call.enqueue(new Callback() {
		 @Override
		 public void onFailure(Call call, IOException e) {

      }

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

      }
  });

  //取消请求
  call.cancel();

enqueue()

方法发送异步网络请求并将响应通过回调函数的方式返回,其中已经默认开启了一个工作线程执行网络请求和数据解析,并在主线程上执行回调函数。这样可以避免在主线程中阻塞UI操作。
其内部则利用了Java中的线程池技术,即使用 ThreadPoolExecutor 来管理线程池,执行网络请求任务并处理响应结果。当创建 OkHttpClient 对象时,默认最大线程数(默认值为 5)是从 Runtime 中获取可用于此进程的处理器数量及其它系统参数来动态计算得出的,但也可以通过构建一个新的 Dispatcher 实例并设置线程池的最大线程数来覆盖默认值。
以下是 enqueue() 方法以及常见的一些方法的示例:

	// 创建 OkHttpClient.Builder 实例
              OkHttpClient.Builder builder = new OkHttpClient.Builder();
        //  可以对 OkHttp 的相关属性进行配置
              builder.connectTimeout(10, TimeUnit.SECONDS);
              builder.readTimeout(10, TimeUnit.SECONDS);
              builder.writeTimeout(10, TimeUnit.SECONDS);

        // 构建 OkHttpClient 对象
              OkHttpClient client = builder.build();

        // 创建 Request 对象
              Request request = new Request.Builder()
                  .url("http://www.example.com")
                  .build();

        // 异步发送网络请求并处理响应结果
              client.newCall(request).enqueue(new Callback() {
                  @Override
                  public void onFailure(Call call, IOException e) {
                      // 处理请求失败情况
                  }

          @Override
          public void onResponse(Call call, Response response) throws IOException {
              // 处理响应成功情况
              String responseBody = response.body().string();
              // ...
          }
         });

常见的方法包括:

  •   newCall(Request request):创建 Call 对象,用于取消或者执行请求。
    
  •   call.execute():同步请求,会阻塞当前线程直到请求完成。
    
  •   call.enqueue(Callback callback):异步请求,通过回调函数处理响应结果。