【问题标题】:Why is RxJava often used with Retrofit?为什么 RxJava 经常与 Retrofit 一起使用?
【发布时间】:2017-07-02 06:32:52
【问题描述】:

Retrofit 与 Rxjava 结合使用有什么好处?

【问题讨论】:

  • 它使数据像流一样流动,操作链接以避免嵌套回调
  • @WenChao 好点.. tks
  • RxJava 不只是用于后台任务,它是一个完整的模式,如果你在一个层中使用它,你是对的,你并没有从中受益最多,这会将你的所有应用程序转移到流中抛出可观察对象,流可以用作其他流的输入(功能部分。添加到这个 RxJava 中最重要的运算符之一是 zip 运算符,它允许您轻松地将多个调用组合成一个。

标签: android retrofit rx-java retrofit2


【解决方案1】:

问题

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

我认为最重要的是,避免嵌套回调(callback hell)。

例如)回调地狱(改造)

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 来避免这种情况。

附加

上面的代码sn-p只是一个例子。

事实上,RxJava 包含更多与observe pattern 相关的功能。

附加 - Android (RxJava) 中事件驱动编程的好处

大多数Android application 是使用基于用户或数据的interaction 构建的。 (例如,交互发生时 GUI 更新)。因此,我们将这些视为set of events,并基于此设计和构建应用程序非常直观且适用于内部和外部事件。

【讨论】:

  • 您可以嵌套不同的 Web 服务调用,如果您使用的是 lambdas,则代码非常干净。
  • 感谢您的回答。如果您再添加一些分数,您肯定会获得 100 多票。很多程序员在谷歌上搜索这个答案。
  • @RanjithKumar 我添加了更多代码 sn-p 和解释。
  • 您可以添加更多关于 RxJava 令人惊叹的运算符的内容,以及在订阅者使用它之前如何在后台流中更轻松地操作数据。
【解决方案2】:

要了解这些优势,您必须首先了解采用反应式扩展对您的代码库有多大好处。

  • 可组合性和转换

    • Streams 提供了非常可组合的接口。它允许您执行转换(关于事件的结构和时间)操作,并且基本上在各种流之间无缝交互(例如建立依赖关系或利用来自另一个流的结果/错误)。虽然你可以使用回调来做到这一点,但如果你尝试实现一个更复杂的用例,甚至可以像 3 个请求一样简单,代码将很快失去可读性。另一方面,Rx 可让您实现非常复杂的场景,并且看起来仍然很流畅。
  • 线程和异步操作

    • Rx 让您可以非常精细地控制哪些线程将用于在流中的各个点执行工作。在这里已经指出了对比,Retrofit 中使用的基本调用方法只是在其工作线程上调度工作并将结果转发回调用线程。当声明为流时,retrofit 不处理线程,只将其留给您,由您控制。
  • Rx 库

    • 您可能已经看到,有无数的库利用响应式扩展并将各种功能实现为流。在处理您的请求时,您可以轻松利用它们

除此之外还有其他优势,但您可以看出被动响应是非常有益的。请求是学习使用流并逐渐在您的代码库中引入越来越多的流逻辑的一个很好的起点。

这不是替代品。 RxJava 和 Retrofit 是天作之合,这就是 Retrofit 对它的原生支持的原因。

【讨论】:

    猜你喜欢
    • 2020-08-04
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2016-02-13
    相关资源
    最近更新 更多