Rx java RxJava如何停止在concatMap中执行后面的观察

Rx java RxJava如何停止在concatMap中执行后面的观察,rx-java,rx-android,reactivex,concatmap,Rx Java,Rx Android,Reactivex,Concatmap,我有一个函数evaluate(),它接收任务列表 表示任务的每个整数的简化版本 Integer[]tasks=新整数[]{5,3,2,6}; 要求: 我需要按顺序执行每个给定的任务,3不能在5完成之前开始 当执行整个列表时,函数应该通知调用该函数的人 这些执行不能在主UI线程中完成 任务的计算结果可能为false,在这种情况下,提前停止列表,并通知调用此函数的人(与2相同),这不是错误,只是忽略列表中后面的任务 我设法用concatMap完成了需求1,2,3 我需要帮助实现4,concatMa

我有一个函数evaluate(),它接收任务列表

表示任务的每个整数的简化版本

Integer[]tasks=新整数[]{5,3,2,6};
要求:

  • 我需要按顺序执行每个给定的任务,3不能在5完成之前开始
  • 当执行整个列表时,函数应该通知调用该函数的人
  • 这些执行不能在主UI线程中完成
  • 任务的计算结果可能为false,在这种情况下,提前停止列表,并通知调用此函数的人(与2相同),这不是错误,只是忽略列表中后面的任务
  • 我设法用concatMap完成了需求1,2,3

    我需要帮助实现4,concatMap将执行每个任务的顺序像一个forloop到列表的末尾,我需要打破这个循环 到目前为止,我所拥有的:

    private Single evaluateArray(){
    Log.i(标记“evaluateArray()”);
    整数[]任务=新整数[]{5,3,2,6};
    @非Null Single observable=observatable.fromArray(任务)
    //并行执行,要实现并行,您需要多个可观察对象。
    .concatMap(新函数(){
    @凌驾
    公共可观察资源应用(整数i)抛出可丢弃{
    返回Observable.create(newobservableOnSubscribe(){
    @凌驾
    public void subscribe(@NonNull observeiemitter-emitter)抛出可丢弃的{
    Log.i(标记,i+“开始”);
    executeSingle(i).subscribe(新观察者(){
    @凌驾
    订阅时的公共无效(@NonNull-d){
    }
    @凌驾
    public void onNext(@NonNull Boolean evalStatus){
    //我可以在这里获得评估状态,在这里做什么
    //如果为false,我应该在这里停止评估,完成整个列表
    }
    @凌驾
    公共无效onError(@NonNull可丢弃e){
    }
    @凌驾
    未完成的公共空间(){
    Log.i(标记,i+“完成”);
    emitter.onComplete();
    }
    });
    }
    }).subscribeOn(Schedulers.newThread());
    }
    })
    //等待,直到所有任务都执行完毕
    //请注意,您的所有可观察对象都应发出onComplete事件
    //否则你将永远等待
    .toList()//返回到1可观察
    //可以实现更智能的逻辑。例如,检查一切是否成功
    .map(新函数(){
    @凌驾
    公共字符串应用(列表整数)抛出可丢弃{
    返回“”;
    }
    });
    可观测收益;
    }
    
    任何调用此函数的人都可以订阅此返回的observable以获取finish事件

    如何执行单个任务的简化版本,用于演示,如果给定任务为2,则评估为false并停止执行

    public observeable executeSingle(int i){
    返回Observable.create(newobservableOnSubscribe(){
    @凌驾
    public void subscribe(@NonNull observeiemitter-emitter)抛出可丢弃的{
    系统时钟睡眠(i*1000);
    emitter.onNext(i!=2);//如果为2,则返回false以通知列表
    emitter.onComplete();
    }
    });
    }