【问题标题】:How to perform chain tasks in RxJava?如何在 RxJava 中执行链式任务?
【发布时间】:2019-05-01 12:35:51
【问题描述】:

我想在 RxJava 中一个一个地执行任务。
例如:-
1. 从服务器获取用户 ID
2.通过ID从服务器获取用户。

我试过这个方法

public Observable<List> getUids(){
       return Observable.create(emitter -> {
           List<String> uids = new ArrayList<>();
           //fetchData from server
            emitter.onNext(uids);

       });
}

public Observable<User> getUser(String uid){
       return Observable.create(emitter -> {
           User user = new User();
           //fetchData user from server
            emitter.onNext(user);
       });
}

//Executing this code like 

   getUids().flatMapIterable(ids -> ids)
               .flatMap(this::getUser)
               .subscribe(new Observer<User>() {
                 @Override
                 public void onSubscribe(Disposable d) {

                 }
                 @Override
                 public void onNext(User user) {
                   print("next "+user.getName());
                 }

                 @Override
                 public void onError(Throwable e) {
                   print("error "+e.getMessage());
                 }

                 @Override
                 public void onComplete() {
                   print("complete");
                 }
             });

里面有一些问题
1.在获取所有用户时,这不是调用订阅者的onComplete()方法。
2.如果getUser方法有错误,应用程序崩溃。 io.reactivex.exceptions.UndeliverableException 异常

你能告诉我我哪里弄错了吗?

【问题讨论】:

  • 你能用disposable吗?
  • 我是 RxJava 新手。如果它解决了我的问题,我会做任何解决方案
  • 对无序结果使用flatMap 运算符或对有序结果使用concatMap,即task1.getIds().flatMapIterable(ids -&gt; ids).flatMap(id -&gt; task2.getUser(id)).subscribe(user -&gt; { ... })
  • 我已经这样做了

标签: java android rx-java rx-java2 rx-android


【解决方案1】:
  1. 在您的getUids()getUser(...) Observables 中调用emitter.onComplete(),然后在.flatMap(this::getUser) 之后附加.toList()

    返回一个发出单个项目的 Single,由有限源 ObservableSource 发出的所有项目组成的列表。

  2. UndeliverableException.flatMap(this::getUser) 中发生的异常的包装器。对于您提供的信息,我无法为您提供更多帮助,当抛出异常时您希望发生什么?

【讨论】:

  • 例如,如果我在“getUser”方法中推送emitter.error(new Throwable("error"));,它会抛出UndeliverableException
  • 阅读这篇关于 UndeliverableException 的文章:Bryan Herbst link.medium.com/FKNzrtj4kW 的“RxJava2 默认错误处理程序”
  • 并且订阅者在添加 .toList() 后没有调用
  • 您的getUids() Observable 必须在发出 uid 列表后完成。
  • Single&lt;List&lt;Student&gt;&gt; listSingle = getUids().flatMapIterable(ids -&gt; ids) .flatMap(this::getUser) .toList(); listSingle.subscribe((students, throwable) -&gt; { if(throwable != null){ print("error "+throwable.getMessage()); }else{ print("done"); } }); 不工作
猜你喜欢
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多