RxJava-可观察环境中的多个任务
我有一个包含许多对象的列表,我将使用它作为观察对象,每个对象有两个url,在每次消费中,我应该确保两个url都下载成功,如果其中一个url没有下载,RxJava应该停止工作,我是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
public class mediaChunk
{
public String audioChunkUrl;
public String videoChunkUrl;
}
List<mediaChunk> list = new ArrayList<>();
公共类mediaChunk
{
公共字符串地址;
公共字符串地址;
}
列表=新的ArrayList();
一种方法是:
Observable.fromIterable
factory方法从初始列表设置流
flatMap
该流的每个发射,并使用可观察的方法。只需
工厂方法,即可从每个MediaChunk
实例创建音频+视频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() + ")");
}
);