在 Android 开发中,Retrofit + RxJava 是非常常见的组合,用来处理异步网络请求 + 响应式编程。下面从「依赖」「接口定义」「使用方式」「线程切换」四个方面说明。
以 Retrofit 2 + RxJava 3 为例:
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.11.0'
implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
// RxJava
implementation 'io.reactivex.rxjava3:rxjava:3.1.8'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
// Retrofit 对 RxJava 的支持
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.11.0'
⚠️ 注意:
- RxJava2 →
adapter-rxjava2- RxJava3 →
adapter-rxjava3
必须添加 RxJava 适配器:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create()) // 关键
.build();
Observablepublic interface ApiService {
@GET("user/info")
Observable<User> getUserInfo(@Query("id") int id);
}
Single(推荐,单次请求)@GET("user/info")
Single<User> getUserInfo(@Query("id") int id);
Flowable(背压场景)@GET("user/list")
Flowable<List<User>> getUserList();
apiService.getUserInfo(1)
.subscribeOn(Schedulers.io()) // 网络请求在 IO 线程
.observeOn(AndroidSchedulers.mainThread()) // 回到主线程
.subscribe(
user -> {
// 成功
Log.d("RxJava", user.getName());
},
throwable -> {
// 失败
throwable.printStackTrace();
}
);
apiService.login()
.flatMap(token -> apiService.getUserInfo(token))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(user -> {
// 登录后再获取用户信息
}, Throwable::printStackTrace);
Single.zip(
apiService.getUserInfo(1),
apiService.getUserOrder(1),
(user, order) -> new UserInfoWithOrder(user, order)
).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
// 两个请求都完成
});
避免内存泄漏:
CompositeDisposable disposable = new CompositeDisposable();
disposable.add(
apiService.getUserInfo(1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...)
);
@Override
protected void onDestroy() {
super.onDestroy();
disposable.clear();
}
❌ 忘记加 RxJavaCallAdapterFactory
❌ 在主线程做网络请求
❌ 忘记 dispose() 导致内存泄漏
Retrofit 负责“怎么发请求”,RxJava 负责“怎么处理异步和数据流”
如果你愿意,我可以:
你想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。