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

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

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

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

例如)callback地狱(改造)

 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 } }); 

例如)避免callback地狱(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相关的function。

附加 – Android中事件驱动编程的优点(RxJava)

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

要理解这些优点,您首先必须了解您的代码库采用反应式扩展的好处。

  • 可组合性和转换

    • stream提供了非常可组合的界面。 它允许您执行变换(关于事件的结构和时间)操作,并且基本上与各个stream之间的无缝地交互(例如使得依赖性或利用来自另一个stream的结果/错误)。 尽pipe你可以用callback来实现这个function,但是如果你试图实现一个更复杂的用例,那么这个用例可能就像3个请求一样简单,代码将很快失去可读性。 另一方面,Rx可以让你实现非常复杂的场景,并且看起来很stream畅。
  • 线程和asynchronous操作

    • Rx可以非常精确地控制哪些线程将用于在stream内的各个点执行工作。 为了在这里指出对比,Retrofit中使用的基本调用方法只是调度工作线程的工作,并将结果转发callback用线程。 当声明为stream时,翻新不会处理线程并将其留给您,只有您可以控制它。
  • Rx库

    • 正如您可能已经看到的那样,有无数的库利用Reactive扩展并将各种function实现为stream。 处理您的请求时,您可以轻松利用这些优势

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

这不是一个替代。 RxJava和Retrofit是一个完美的搭配,这就是为什么在改造的时候原生支持它。