为什么RxJava经常与Retrofit一起使用?

51

在使用Retrofit和RxJava组合的情况下,有哪些好处?


5
它使数据像流一样流动,通过操作链来避免嵌套回调。 - WenChao
@WenChao 很好的观点.. 谢谢 - Ranjithkumar
2
RxJava不仅仅是用于后台任务的,它是一个完整的模式。如果你只在一个层面上使用它,那么你并没有充分利用它的优势,即通过可观察流将所有应用程序转换为流,流可以作为其他流的输入(函数部分)。此外,RxJava中最重要的运算符之一是zip运算符,它允许您轻松地将多个调用组合成一个调用。 - Mohamed
2个回答

48

问题

Retrofit已经在后台线程上运行了。那么为什么还需要另一个后台任务RxJava呢?

我认为最重要的是避免嵌套回调(回调地狱)。

例如)回调地狱(Retrofit)

public interface MyService
{
    @GET("users")
    Call<List<UserModel>> getUser();

    @GET("userinfo")
    Call<UserInfoModel> getUserInfoById(@Query("id") Integer id);
}

service.getUser().enqueue(new Callback<UserModel>() {

    @Override
    public void onResponse(Call<UserModel> call, Response<UserModel> response) {
        //process UserModel

        UserModel data = response.body();

        //if you want user infomation from server
        service.getUserInfo(data.getId()).enqueue(new Callback<UserInfoModel>(){
            //... is callback hell!!
        });

    }
    @Override
    public void onFailure(Call<UserModel> call, Throwable t) {
       //error handling
    }
});

例如)避免回调地狱(Retrofit + RxJava)

public interface MyService
{
    @GET("users")
    Observable<List<UserModel>> getUser();

    @GET("userinfo")
    Observable<UserInfoModel> getUserInfoById(@Query("id") Integer id);
}

service.getUser()
    .flatMapIterable(list -> list)
    .flatMap(user -> service.getUserInfoById(user.getId()))
    .doOnNext(userinfo -> saveUserInfo(userinfo)).subscribe();

如果您正在使用 RxJava,您可以使用 Observable 来避免这种情况。 附加信息 上面的代码片段只是一个示例。
实际上,RxJava 包含更多与 观察者模式 相关的功能。 附加信息 - Android 中事件驱动编程(RxJava)的好处 大多数 Android 应用程序 是基于用户或数据 交互 构建的。 (例如,当发生交互时,GUI 更新)。 因此,我们将这些视为一组事件,并基于此设计和构建应用程序对于内部和外部事件来说非常直观和合适。

1
您可以嵌套不同的Web服务调用,如果您使用lambda表达式,代码会非常干净。 - Josué de León Santana
1
感谢您的回答。如果您能添加更多的内容,肯定会得到100多个赞。许多程序员正在通过谷歌搜索这个答案。 - Ranjithkumar
2
@RanjithKumar 我添加了更多的代码片段和解释。 - Ethan Choi
1
在订阅者操作数据之前,您可以添加更多关于RxJava惊人运算符的行,并说明如何在后台流中更轻松地操纵数据。 - Mohamed

10
为了理解这些优势,首先必须了解采用响应式扩展对您的代码库有多么有益。
- 组合和转换
流提供了非常可组合的接口。它允许您执行转换操作(在事件的结构和时间上)并在各个流之间无缝地交互(例如建立依赖关系或利用另一个流的结果/错误)。虽然您可以使用回调来实现此功能,但如果您尝试实现更复杂的用例(甚至可能只是3个请求),代码将很快失去可读性。另一方面,Rx让您实现非常复杂的场景仍然看起来很流畅。
- 线程和异步操作
Rx使您对在流中不同点执行工作的线程具有非常精细的控制。为了对比,Retrofit中使用的基本调用方法仅在其工作线程上安排工作,并将结果转发回调用线程。当声明为流时,Retrofit不处理线程,只留下给您控制。
- Rx库
正如您可能已经看到的,有数不清的库利用了响应式扩展并将各种功能实现为流。在处理请求时,您可以轻松地利用它们的优势。
除了这些之外,还有其他优点,但您可以看出采用响应式是非常有益的。请求非常适合学习如何使用流,并逐渐在代码库中引入越来越多的流逻辑。
这不是一种代替方式。RxJava和Retrofit是完美的匹配,这就是为什么Retrofit本身具有对它的本地支持的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接