温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

rxjava如何与retrofit结合

发布时间:2026-09-20 17:23:28 来源:亿速云 阅读:84 作者:小樊 栏目:编程语言

在 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

二、Retrofit 配置(关键)

必须添加 RxJava 适配器:

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.example.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) // 关键
        .build();

三、定义 API 接口(返回 Observable / Single)

1️⃣ 返回 Observable

public interface ApiService {

    @GET("user/info")
    Observable<User> getUserInfo(@Query("id") int id);
}

2️⃣ 返回 Single(推荐,单次请求)

@GET("user/info")
Single<User> getUserInfo(@Query("id") int id);

3️� 返回 Flowable(背压场景)

@GET("user/list")
Flowable<List<User>> getUserList();

四、使用 RxJava 调用 Retrofit

示例:Single + 线程切换

apiService.getUserInfo(1)
        .subscribeOn(Schedulers.io())        // 网络请求在 IO 线程
        .observeOn(AndroidSchedulers.mainThread()) // 回到主线程
        .subscribe(
                user -> {
                    // 成功
                    Log.d("RxJava", user.getName());
                },
                throwable -> {
                    // 失败
                    throwable.printStackTrace();
                }
        );

五、多个请求组合(RxJava 优势)

1️⃣ 串行(flatMap)

apiService.login()
        .flatMap(token -> apiService.getUserInfo(token))
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(user -> {
            // 登录后再获取用户信息
        }, Throwable::printStackTrace);

2️⃣ 并行(zip)

Single.zip(
        apiService.getUserInfo(1),
        apiService.getUserOrder(1),
        (user, order) -> new UserInfoWithOrder(user, order)
).subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(result -> {
     // 两个请求都完成
 });

六、在 Activity / Fragment 中管理生命周期(重要)

避免内存泄漏:

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 负责“怎么处理异步和数据流”

如果你愿意,我可以:

  • 给你一个 完整 Demo
  • 讲 RxJava2 vs RxJava3 区别
  • 或对比 Retrofit + Coroutine(Kotlin)

你想看哪一个?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手