RxJava主题的真实世界用例

时间:2016-12-14 09:01:10

标签: android rx-java

有很多很棒的文章解释了 RxJava 。但几乎没有一个用现实世界的例子来解释这个概念。

所以我基本上理解 RxJava主题的概念,如管道,它同时是observableobserver

但我不知道Android开发世界中这个 RxJava主题的真实用法是什么。你能详细说明一下吗?

4 个答案:

答案 0 :(得分:1)

在我的情况下,因为我有一个Observable正在等待另一个Observable的项目,因为它是Interval,所以它是异步的。

Scheduler scheduler = RxHelper.scheduler(vertx.getOrCreateContext());


Observable.just(callAnotherObservable)
          .subscribe(item -> System.out.println(item)

public Observable<String> callAnotherObservable(Scheduler scheduler, ){
          Subject subject = ReplaySubject.create(1);
          Observable.interval(100,TimeUnit.MILLISECONDS)
          .map(i->"item to be passed to the other observable")
          .subscribe(subject);
          return subject.observeOn(scheduler).first();//Here we wait for the first emission of the interval Observable.

}

在这里你可以看到我们使用subject.first()来等待第一次发出的间隔observable,它正在另一个线程中运行。

如果你想看到更多关于&#34; hotObservables&#34;的例子。 https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/connectable/HotObservable.java

答案 1 :(得分:1)

主题有很多真实世界&#34;应用程序,特别是当您逐渐将代码库从命令式转换为反应型时。它可以作为这两个世界之间的桥梁,在这两个世界中,您可以使用非流动的代码来影响流。

但是你问了一个例子。最近,当用户尝试从活动中返回时,我正在实现自定义行为。 RxJava为我所面临的问题提供了非常优雅的解决方案,因此我需要编写一系列与想要返回的用户相对应的事件。我故意避免使用短语&#34;按下后退按钮&#34;,因为代码库中有几个地方我可以模拟返回情况,它总是通过onBackPressed()方法。

将此转换为单个流需要进行大规模重构,而现在还没有达到预算。但我并不想通过RxJava放弃解决方案,因为它可以使代码更加简洁。使用BehaviorSubject给出了答案,因为我只需要在onBackPressed()方法中发出事件。

答案 2 :(得分:0)

我正在为Android应用程序构建一个通用的ReportDownloadManager,我们需要使用一个Observable,它的Observer会在本地下载并存储一个文件。下载成功或不成功的事件需要由管理员处理,但也需要将Observable暴露给使用此DownloadManager的活动/服务。我相信这是一个很好的用例,用于使用Subject来消耗初始的Observable,但也为客户端Observable生成事件。

import android.app.DownloadManager;
import android.content.Context;
import android.webkit.MimeTypeMap;

import java.io.File;

import io.reactivex.Observable;
import io.reactivex.functions.Consumer;
import io.reactivex.subjects.PublishSubject;

public class ReportDownloadManager {

    private final DownloadManager platformDownloadManager;

    public ReportDownloadManager(Context context) {
        this.platformDownloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
    }

    public Observable<Object> download(final File file, DownloadAction downloadAction) {
        final PublishSubject<Object> subject = PublishSubject.create();
        downloadAction.execute(file.getName())
                .subscribe(new Consumer<Object>() {
                    @Override
                    public void accept(Object o) throws Exception {
                        platformDownloadManager.addCompletedDownload(file.getName(), "No description", false,
                                MimeTypeMap.getSingleton().getMimeTypeFromExtension("pdf"), file.getAbsolutePath(),
                                file.length(), true);
                        subject.onNext(new Object());
                        subject.onComplete();
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        subject.onError(throwable);
                    }
                });
        return subject;
    }

    interface DownloadAction {
        Observable<Object> execute(String fileAbsolutePath);
    }

}

答案 3 :(得分:0)

如果您需要我在图中显示的情况

enter image description here