Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava-可观察环境中的多个任务_Java_Android_Rx Java_Rx Android - Fatal编程技术网

RxJava-可观察环境中的多个任务

RxJava-可观察环境中的多个任务,java,android,rx-java,rx-android,Java,Android,Rx Java,Rx Android,我有一个包含许多对象的列表,我将使用它作为观察对象,每个对象有两个url,在每次消费中,我应该确保两个url都下载成功,如果其中一个url没有下载,RxJava应该停止工作,我是RxJava新手,我可以做简单的工作 这是我的目标 public class mediaChunk { public String audioChunkUrl; public String videoChunkUrl; } List<mediaChunk> list = new ArrayL

我有一个包含许多对象的列表,我将使用它作为观察对象,每个对象有两个url,在每次消费中,我应该确保两个url都下载成功,如果其中一个url没有下载,RxJava应该停止工作,我是RxJava新手,我可以做简单的工作

这是我的目标

public class mediaChunk
{
    public String audioChunkUrl;
    public String videoChunkUrl;
}

List<mediaChunk> list = new ArrayList<>();
公共类mediaChunk
{
公共字符串地址;
公共字符串地址;
}
列表=新的ArrayList();
一种方法是:

  • 使用
    Observable.fromIterable
    factory方法从初始
    列表设置流
  • flatMap
    该流的每个发射,并使用可观察的
    方法。只需
    工厂方法,即可从每个
    MediaChunk
    实例创建音频+视频URL流
  • 结果是一个扁平的URL流,订阅者可以为其插入自己的
    onNext
    onError
    onComplete
    处理程序

    代码如下所示:

    Observable.fromIterable(
            Arrays.asList(
                new MediaChunk("audio-1", "video-1"),
                new MediaChunk("audio-2", "video-2"),
                new MediaChunk("audio-3", "video-3")
            ))
            .flatMap(chunk -> Observable.just(chunk.audioChunkUrl, chunk.videoChunkUrl))
            .subscribe(
                value -> {
                  System.out.println("## onNext(" + value + ")");
                },
                error -> {
                  System.out.println("## onError(" + error.getMessage() + ")");
                },
                () -> {
                  System.out.println("## onComplete()");
                }
            );
    
    不确定这是否符合要求,但希望它至少足以激发一些思考

    更新-将排放映射到可完成排放的示例


    谢谢homerman。我应该在subscribe中实现下载作业,还是应该在flatMap中实现它?像这样:
    .flatMap(chunk->Observable.just(chunk.videoUrl,chunk.audioUrl).doOnNext(value->{download(value);}))
    对于一种方法优于另一种方法,可能有令人信服的技术论据,但我想不出来。尝试两种方法,看看哪一种更适合您的设计。我可能会提供一些想法——如果下载任务只是在某个地方保存文件,订阅者在<代码> OnNest< /C>中没有任何工作要做,那么你可以考虑将每个发射转换成<代码>完整的 >以简单地表示所有下载已经完成,或者失败了。我用一个例子更新了我的答案。
    Observable.fromIterable(
        Arrays.asList(
            new MediaChunk("audio-1", "video-1"),
            new MediaChunk("audio-2", "video-2"),
            new MediaChunk("audio-3", "video-3")
        ))
        .flatMap(chunk -> Observable.just(chunk.audioChunkUrl, chunk.videoChunkUrl))
        .flatMapCompletable(url -> {
          return Completable.fromCallable(() -> {
            return "## ...handling network call for [" + url + "]";
          });
        })
        .subscribe(
            () -> {
              System.out.println("## onComplete()");
            },
            error -> {
              System.out.println("## onError(" + error.getMessage() + ")");
            }
        );