Retrofit + RxJava + OkHttp 是 Android 开发中常用的网络请求库组合。Retrofit 是一个类型安全的 HTTP 客户端,RxJava 是一个响应式编程库,OkHttp 是一个高效的 HTTP 客户端。
Retrofit + RxJava + OkHttp 的组合可以提供以下功能:
职责清晰
RetrofitClient 负责 Retrofit 和 OkHttp 的初始化。
ApiServiceHelper 负责动态创建 API 服务实例。
NetworkHelper 负责发起网络请求和处理结果。
1. 动态配置 Retrofit 和 OkHttp
允许在运行时动态修改 Retrofit 和 OkHttp 的配置,例如 Base URL、超时时间、拦截器等。
统一错误处理
增强错误处理的灵活性,支持自定义错误处理器。支持多环境切换
通过配置文件或 Build Variants 动态切换测试环境和生产环境。添加缓存机制
通过 OkHttp 的缓存拦截器实现本地缓存,减少网络请求。Token 自动管理
通过拦截器自动添加 Token 并处理 Token 过期。支持文件上传/下载
扩展 API 服务接口,支持文件操作。日志优化
根据不同的 Build 类型(Debug/Release)动态调整日志级别。生命周期绑定
将网络请求与 Activity/Fragment 的生命周期绑定,避免内存泄漏。
代码如下:
RetrofitClient:支持动态配置
import okhttp3.Cache;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import java.io.File;
import java.util.concurrent.TimeUnit;
public class RetrofitClient {
private static Retrofit retrofit;
private static OkHttpClient okHttpClient;
private RetrofitClient() {
// 私有构造函数,防止外部实例化
}
public static Retrofit getRetrofit() {
if (retrofit == null) {
synchronized (RetrofitClient.class) {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com/") // 默认 Base URL
.client(getOkHttpClient())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.build();
}
}
}
return retrofit;
}
public static OkHttpClient getOkHttpClient() {
if (okHttpClient == null) {
synchronized (RetrofitClient.class) {
if (okHttpClient == null) {
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS);
// 添加缓存(10MB)
File cacheDir = new File(System.getProperty("java.io.tmpdir"), "http-cache");
builder.cache(new Cache(cacheDir, 10 * 1024 * 1024));
// 添加日志拦截器(仅在 Debug 模式下启用)
if (BuildConfig.DEBUG) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(logging);
}
okHttpClient = builder.build();
}
}
}
return okHttpClient;
}
/**
* 动态修改 Base URL
*/
public static void setBaseUrl(String baseUrl) {
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(getOkHttpClient())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.build();
}
/**
* 动态修改 OkHttp 配置
*/
public static void setOkHttpClient(OkHttpClient client) {
okHttpClient = client;
retrofit = new Retrofit.Builder()
.baseUrl(retrofit.baseUrl().toString())
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.build();
}
}
NetworkHelper:支持自定义错误处理器
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.schedulers.Schedulers;
import io.reactivex.rxjava3.disposables.Disposable;
public class NetworkHelper {
/**
* 发起网络请求
*
* @param single RxJava 的 Single 对象
* @param successHandler 成功回调
* @param errorHandler 失败回调
* @return Disposable 对象,用于取消订阅
*/
public static <T> Disposable request(Single<T> single, OnSuccess<T> successHandler, OnError errorHandler) {
return single.subscribeOn(Schedulers.io()) // 在 IO 线程执行网络请求
.observeOn(AndroidSchedulers.mainThread()) // 在主线程处理结果
.subscribe(
successHandler::onSuccess, // 成功回调
throwable -> errorHandler.onError(handleError(throwable)) // 失败回调
);
}
/**
* 统一处理错误
*/
private static String handleError(Throwable throwable) {
if (throwable instanceof IOException) {
return "网络连接失败,请检查网络设置";
} else if (throwable instanceof HttpException) {
return "服务器错误,请稍后重试";
} else {
return "未知错误:" + throwable.getMessage();
}
}
// 成功回调接口
public interface OnSuccess<T> {
void onSuccess(T result);
}
// 失败回调接口
public interface OnError {
void onError(String errorMessage);
}
}
ApiServiceHelper:
import java.lang.reflect.Proxy;
public class ApiServiceHelper {
/**
* 创建 API 服务实例
*
* @param serviceClass API 服务接口类
* @return API 服务实例
*/
public static <T> T createService(Class<T> serviceClass) {
return (T) Proxy.newProxyInstance(
serviceClass.getClassLoader(),
new Class<?>[]{serviceClass},
(proxy, method, args) -> {
// 通过 Retrofit 创建真正的 API 服务实例
T service = RetrofitClient.getRetrofit().create(serviceClass);
// 调用方法并返回结果
return method.invoke(service, args);
});
}
}
ApiResponse:统一封装响应基类
public class ApiResponse<T> {
private int code; // 状态码
private String message; // 消息
private T data; // 数据
// 无参构造函数
public ApiResponse() {}
// 全参构造函数
public ApiResponse(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
// Getter 和 Setter 方法
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
// toString 方法
@Override
public String toString() {
return "ApiResponse{" +
"code=" + code +
", message='" + message + '\'' +
", data=" + data +
'}';
}
}
User.java类
public class User {
private int id;
private String name;
private String email;
// 无参构造函数
public User() {}
// 全参构造函数
public User(int id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
// Getter 和 Setter 方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
// toString 方法
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
'}';
}
}
ApiService服务类
import io.reactivex.rxjava3.core.Single;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.http.*;
public interface ApiService {
// 获取用户信息
@GET("users/{username}")
Single<User> getUser(@Path("username") String username);
// 搜索用户
@GET("users/search")
Single<List<User>> searchUsers(@Query("query") String query);
// 创建用户
@POST("users")
Single<User> createUser(@Body User user);
// 文件上传
@Multipart
@POST("upload")
Single<ApiResponse<String>> uploadFile(@Part MultipartBody.Part file);
// 文件下载
@Streaming
@GET("files/{filename}")
Single<ResponseBody> downloadFile(@Path("filename") String filename);
}
在业务层调用
public class MainActivity extends AppCompatActivity {
private Disposable disposable; // 用于保存 Disposable 对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建 API 服务实例
ApiService apiService = ApiServiceHelper.createService(ApiService.class);
// 发起网络请求
disposable = NetworkHelper.request(
apiService.getUser("john_doe"),
user -> {
// 处理成功结果
Log.d("User", user.toString());
},
errorMessage -> {
// 处理错误
Log.e("Error", errorMessage);
}
);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 取消网络请求,避免内存泄漏
if (disposable != null && !disposable.isDisposed()) {
disposable.dispose();
}
}
}