在RxJava中具有多个回调的单个操作

时间:2016-12-06 19:18:27

标签: rx-java

如何在RxJava中公开具有多个回调的单个操作(例如,START与某些参数,STARTESS与其他参数多次调用,END与其他参数一起调用)?

我正在考虑使用一个包装器对象,该对象包含每种回调的observable,并且任何一个observable的订阅都会触发操作的开始,而另一个绑定在同一个底层操作上

编辑:下载操作的示例回调接口

interface Callback {
    void onDownloadStarted(long contentLength, String mimeType, String nameHint);
    void onDownloadProgress(long downloadedBytes);
    void onDownloadCompleted(File file);
}

1 个答案:

答案 0 :(得分:1)

您可以将您的操作视为Observable<Status>

public static class Info {
    public final long contentLength;
    public final String mimeType;
    public final String nameHint;
    public Info(long contentLength, String mimeType, String nameHint) {
        this.contentLength = contentLength;
        this.mimeType = mimeType;
        this.nameHint = nameHint;
    }
}
public static class Status {
    public final Info info;
    public final long downloadProgress; //in bytes
    public final Optional<File> file;
    public Status(Info info, long downloadProgress, Optional<File> file) {
        this.info = info;
        this.downloadProgress = downloadProgress;
        this.file = file;
    }
}

然后,您可以将下载操作建模为:

Observable<Status> download();

直到下载开始并且最终发射具有File结果,您才会获得排放。

您可以像这样使用它:

download()
   .doOnNext(status -> System.out.println(
        "downloaded " 
        + status.downloadProgress 
        + " bytes of " + status.contentLength))
   .last()
   .doOnNext(status -> System.out.println(
        "downloaded " + status.file.get())
   .doOnError(e -> logError(e))
   .subscribe();