在 Android 项目中使用 OkHttp 进行网络请求(get/post)

1. 在 build.gradle 文件中添加依赖项

打开项目的 build.gradle 文件(通常位于 app 模块下),并在 dependencies 块中添加 OkHttp 依赖项:

dependencies {
    // OkHttp 核心库
    implementation 'com.squareup.okhttp3:okhttp:x.x.x'
    
    // 如果需要使用 OkHttp 的日志拦截器,可以添加下面的依赖项
    implementation 'com.squareup.okhttp3:logging-interceptor:x.x.x'
}

2. 创建一个OkHttpManager类

import android.util.Log;
import okhttp3.*;
import java.util.concurrent.TimeUnit;

public class OkHttpManager {
    private static final String TAG = "OkHttpManager";
    private static final MediaType JSON_MEDIA_TYPE = MediaType.parse("application/json; charset=utf-8");
    private static final int MAX_REQUESTS = 4;
    private static final int CONNECTION_POOL_SIZE = 10;
    private static final int CONNECTION_POOL_KEEP_ALIVE_DURATION = 5;
    private static final int TIMEOUT_DURATION = 30;

    private static volatile OkHttpManager instance;
    private final OkHttpClient httpClient;

    private OkHttpManager() {
        this.httpClient = createHttpClient();
    }

    public static OkHttpManager getInstance() {
        if (instance == null) {
            synchronized (OkHttpManager.class) {
                if (instance == null) {
                    instance = new OkHttpManager();
                }
            }
        }
        return instance;
    }

    private static OkHttpClient createHttpClient() {
        Dispatcher dispatcher = new Dispatcher();
        dispatcher.setMaxRequests(MAX_REQUESTS);
        ConnectionPool connectionPool = new ConnectionPool(CONNECTION_POOL_SIZE, CONNECTION_POOL_KEEP_ALIVE_DURATION, TimeUnit.MINUTES);
        return new OkHttpClient.Builder()
                .dispatcher(dispatcher)
                .connectionPool(connectionPool)
                .connectTimeout(TIMEOUT_DURATION, TimeUnit.SECONDS)
                .writeTimeout(TIMEOUT_DURATION, TimeUnit.SECONDS)
                .readTimeout(TIMEOUT_DURATION, TimeUnit.SECONDS)
                .build();
    }

    // 发送GET请求
    public void sendGetRequest(String url) {
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        try (Response response = httpClient.newCall(request).execute()) {
            if (response.isSuccessful()) {
                String responseBody = response.body().string();
                Log.d(TAG, "Response: " + responseBody);
            } else {
                Log.e(TAG, "Request failed with code: " + response.code());
            }
        } catch (Exception e) {
            Log.e(TAG, "Network request error", e);
        }
    }

    // 发送POST请求
    public String sendPostRequest(String url, String json) {
        RequestBody requestBody = RequestBody.create(JSON_MEDIA_TYPE, json);
        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();
        try (Response response = httpClient.newCall(request).execute()) {
            if (response.isSuccessful()) {
                String responseBody = response.body().string();
                Log.d(TAG, "Response: " + responseBody);
                return responseBody;
            } else {
                Log.e(TAG, "Request failed with code: " + response.code());
                return response.code().toString();
            }
        } catch (Exception e) {
            Log.e(TAG, "Network request error", e);
            return e.toString();
        }
    }
}
  1. 类名和方法名规范化

    • OkHttpManager 以更好地反映其职责。
    •  sendPostRequest 以更具通用性。
  2. 单例模式简化

    • 使用双重检查锁定来确保线程安全的单例实例创建。
  3. 常量提取

    • 提取常量 JSON_MEDIA_TYPE, MAX_REQUESTS, CONNECTION_POOL_SIZE, CONNECTION_POOL_KEEP_ALIVE_DURATION, TIMEOUT_DURATION 以提高可维护性。
  4. 异常处理优化

    • 保持原有的异常处理逻辑,但确保尽量捕获特定异常以便于调试和维护。
  5. 资源管理改进

    • 使用 try-with-resources 来确保 Response 对象在使用后被正确关闭。

通过这些,代码变得更清晰、规范,同时提高了可维护性和可读性。
注意:需要修改依赖库版本时可以去OkHttp官方查找然后修改版本

你可能感兴趣的:(android,okhttp)