通信を使うとき, 必要になるだろうよくあるパターンだと思います.
通信状況や不要なリクエストやキャッシュを使うかどうか.
どこからデータを取得してくるか.
- メモリ
- ストレージ
- ネットワーク
それぞれのソース別に Observable を作ったら, 優先順位をつけたら連結する.
ReactiveX - Concat operator
条件をつけて, 最初の一つだけ利用する.
ReactiveX - First operator
そんなサンプルコードがあります.
// Create our sequence for querying best available data
Observable<Data> source = Observable.concat(
sources.memory(),
sources.disk(),
sources.network()
)
.first(data -> data != null && data.isUpToDate());
// "Request" latest data once a second
Observable.interval(1, TimeUnit.SECONDS)
.flatMap(__ -> source)
.subscribe(data -> System.out.println("Received: " + data.value));
rxjava-multiple-sources-sample/Sample.java
public Observable<GfyItem> getGfyItem(final String gifUrl, final String gfyName) {
// Use the first source that returns a valid name
return Observable.concat(
// We already have the name
Observable.just(gfyName),
// We check for a pre-converted gif (for the gfyname)
getPreExistingGfyName(gifUrl),
// We need to convert the gif (then retrieve the gfyname)
convertGifToGfyName(gifUrl)
)
.first(result -> !TextUtils.isEmpty(result))
.flatMap(this::getMetadata)
.map(GfyMetadata::getGfyItem);
}
android-gfycat/GfycatService.java
非常にわかりやすいサンプルや記事で勉強になりますっ.
Loading data from multiple sources with RxJava