OkHttpClient 流程

// 1. 创建 HTTP 客户端
OkHttpClient client = new OkHttpClient();

// 2. 构建请求(例如 GET 请求)
Request request = new Request.Builder()
    .url("https://httpbin.org/get")
    .build();

// 3. 同步执行请求并获取响应
try (Response response = client.newCall(request).execute()) {
    
    // 4. 处理响应
    if (response.isSuccessful()) {
        // 获取响应体内容(字符串形式)响应体只能读取一次,记得先保存
        String responseBody = response.body().string();
        System.out.println("响应内容: " + responseBody);
    } else {
        System.out.println("请求失败: " + response.code());
    }
    
} catch (IOException e) {
    e.printStackTrace(); // 处理网络异常
}

同步 vs 异步

execute():同步请求(阻塞当前线程),适合后台线程使用

enqueue():异步请求(非阻塞,需回调处理),适合主线程/UI线程
// 异步请求(非阻塞)

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onResponse(Call call, Response response) {
        // 在后台线程处理成功响应
    }
    
    @Override
    public void onFailure(Call call, IOException e) {
        // 处理失败
    }
});

资源释放

必须关闭 Response 对象(推荐使用 try-with-resources 语法) 在 try-with-resources 块结束时自动关闭,或在 finally 块中手动调用 response.close()

未关闭会导致内存和连接泄漏

  1. 释放底层 TCP 连接(否则会导致连接池耗尽)
  2. 关闭响应体输入流(防止内存泄漏)
  3. OkHttp 要求必须关闭每个 Response

线程安全

OkHttpClient 应全局复用(不要每次请求都创建新实例)

同步请求不能在 Android 主线程中使用(会引发 NetworkOnMainThreadException)

posted @ 2025-07-01 10:53  kiss_sheep  阅读(34)  评论(0)    收藏  举报