私は、あなたが観測データを入手できると仮定しますあなたのローカルおよびリモート下記のようなから:
final Observable<Page> localResult = mSearchLocalDataSource.search(query);
final Observable<Page> remoteResult = mSearchRemoteDataSource.search(query)
.doOnNext(new Action1<Page>() {
@Override
public void call(Page page) {
if (page != null) {
mSearchLocalDataSource.save(query, page);
mResultCache.put(query, page);
}
}
});
その後、あなたがそれらをマッピングし、リモート使用しない場合、ローカルであればローカル可能な利用を意味している最初の取得できます。
return Observable.concat(localResult, remoteResult)
.first()
.map(new Func1<Page, Page>() {
@Override
public Page call(Page page) {
if (page == null) {
throw new NoSuchElementException("No result found!");
}
return page;
}
});
を、以下のようにそれをサブスクライブ:
https://github.com/savepopulation/wikilight
:
mCompositeSubscription.clear();
final Subscription subscription = mSearchRepository.search(this.mQuery)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Page>() {
@Override
public void onCompleted() {
// Completed
}
@Override
public void onError(Throwable e) {
mView.onDefaultMessage(e.getMessage());
}
@Override
public void onNext(Page page) {
mView.onDefaultMessage(page.getContent());
}
});
mCompositeSubscription.add(subscription);
詳細またはたとえば、あなたは私のgithubのレポをチェックすることができます
幸運を祈る!
編集:
次のようにローカルで観察できます。単にレコードがあるかどうかをチェックし、空のオブザーバブルを返します。
@Override
public Observable<Page> search(@NonNull final String query) {
return Observable.create(new Observable.OnSubscribe<Page>() {
@Override
public void call(Subscriber<? super Page> subscriber) {
final Realm realm = Realm.getInstance(mRealmConfiguration);
final Page page = realm.where(Page.class)
.equalTo("query", query)
.findFirst();
if (page != null && page.isLoaded() && page.isValid()) {
Log.i("data from", "realm");
subscriber.onNext(realm.copyFromRealm(page));
} else {
Observable.empty();
}
subscriber.onCompleted();
realm.close();
}
});
}
編集2:
あなたは地元の連結からnullを返すと、最初に動作しませんし、ヌルが観測リターンがnullの意味が、まだ観察することができますので、お使いのリモコンが呼び出されません。 observable.emptyをconcatで返すと、最初はobservableがローカルより多くのものを放出することができず、リモートからemitできることを意味します。
ありがとうございました。このソリューションは、各リクエストの新鮮なデータをネットワークに送りたい場合にはうまくいくが、キャッシュされたアイテムには有効期限があるため、期限切れ。私のDBクエリは、キャッシュされていないか期限切れではないそのシナリオで空のリストを返すので、最初に空のリストを返した場合にのみ、第2オブザーバブルを実行する手段が必要です。条件付き関数を持つfirst()演算子はそれを行いますが、キャッシュが空であっても観測可能なネットワークは元のコードでは決して実行されません。何か案は? – Francesc
ええ、ええ、私は自分の投稿を編集しました。それがあなたのために働くかどうか見てください。 – ehehhh
ありがとう、これは動作し、簡潔なソリューションです。私はまだ私の元のソリューションが動作しないので、私はそれを調べる必要があります理解していないが、このソリューションは私のニーズにうまく収まる。再度、感謝します。 – Francesc