RxJavaについて説明する記事がたくさんあります。しかし、これらのどれも現実世界の例による概念を説明するものはほとんどありません。RxJavaの実際の使用例件名
だから私は基本的にパイプようRxJava件名の概念を理解し、それがobservable
とobserver
の両方です。
しかし、私はこれの実際の使用法が何であるか分かりませんRxJava Subject Android開発の世界です。あなたはそれについて何か詳細を教えてもらえますか?
RxJavaについて説明する記事がたくさんあります。しかし、これらのどれも現実世界の例による概念を説明するものはほとんどありません。RxJavaの実際の使用例件名
だから私は基本的にパイプようRxJava件名の概念を理解し、それがobservable
とobserver
の両方です。
しかし、私はこれの実際の使用法が何であるか分かりませんRxJava Subject Android開発の世界です。あなたはそれについて何か詳細を教えてもらえますか?
私のケースでは、私は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()を使用して、別のスレッドで実行されているinterval observableの最初の放出を待っています。
被験者は、あなたが徐々に反応スタイルに不可欠から、あなたのコードベースを変換する場合は特に、「現実世界」のアプリケーションの多くを持っている「hotObservables」の例をもっと見たい場合。これは、ストリームの外に出てくる反応しないコードを持つストリームに影響を与えることができるこれらの2つの世界の架け橋になります。
しかし、あなたが例を求めたように。最近、ユーザーがアクティビティから戻ろうとしたときにカスタム動作を実装していました。 RxJavaは、私が直面していた問題に対して非常に洗練されたソリューションを提供しました。私は、戻ってほしいユーザーに対応する一連のイベントを構成する必要がありました。私は意図的に "バックボタンを押してください"というフレーズを避けました。なぜなら、コードベースにいくつかの場所があり、どこに戻る状況をシミュレートすることができ、常にonBackPressed()
メソッドを経由するからです。
これを単一のストリームに変換するには、大規模なリファクタリングが必要になりますが、これは今予算ではありません。しかし、コードをもっと簡潔にすることができたので、私はRxJavaを通して解決策をあきらめたくありませんでした。 BehaviorSubjectを使用すると、ちょうどonBackPressed()
メソッド内でイベントを発生させる必要があるため、答えが得られました。
私はObservableを使用してオブザーバがファイルをローカルにダウンロードして保存する必要があったAndroidアプリケーション用の汎用ReportDownloadManagerを構築していました。成功または失敗したダウンロードのイベントは、マネージャによって処理される必要があっただけでなく、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);
}
}