Eth*_*hoi 38

改造已经在后台线程上运行.那为什么需要另一个后台任务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
    }
});
Run Code Online (Sandbox Code Playgroud)

例如)避免回调地狱(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();
Run Code Online (Sandbox Code Playgroud)

如果您正在使用,RxJava您可以使用Observable以避免这种情况.

额外

上面的代码片段只是一个例子.

实际上,RxJava包含更多observe pattern相关功能.

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

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

  • @RanjithKumar我添加了更多代码片段和解释. (2认同)

kop*_*rko 10

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

  • 可组合性和转换

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

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

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

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

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