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

时间:2017-02-14 04:58:27

标签: android retrofit rx-java retrofit2

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

2 个答案:

答案 0 :(得分:38)

<强>问题

  

Retrofit已经在后台线程上运行。那为什么需要另一个后台任务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来避免这种情况。

<强> 其他

上面的代码片段就是一个例子。

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

其他 - Android中事件驱动编程的好处(RxJava)

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

答案 1 :(得分:9)

要了解这些优势,您必须首先了解代码库采用Reactive Extensions的好处。

  • 可组合性和转型

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

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

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

除了这些之外还有其他优点,但你可以说,反应是非常有益的。请求是学习使用流并逐渐在代码库中引入越来越多的流逻辑的一个很好的起点。

这不是替代品。 RxJava和Retrofit是一个完美的匹配,这就是为什么首先在Retrofit中为它提供原生支持。