私はRxJavaとconcat()
とfirst()
演算子を使用しています:使用CONCAT()と最初の()RxJavaでキャッシュを実装する - 同時呼び出し
public Observable<List<Entity>> getEntities() {
invalidateCacheIfNeeded();
return Observable
.concat(cachedEntities(), networkEntities())
.first();
}
cachedEntities
をキャッシュされたリストの中から構築された観察可能を返しますnetworkEntities
メソッドはRetrofitでエンティティを取得します。
これは、2人のユーザーがgetEntities()
によって返されたオブザーバブルにすばやく登録しない限りうまくいきます。私は、最初の購読のネットワーク要求は、2番目の購読が行われたときに終了していないと思います。この場合、2つのネットワーク要求が実行されます。私は避けたいものです。
最初の呼び出しが終わったが、運にあるときに、第2のコールの実行のみが行われるので、私はシングルスレッドスケジューラを作成しようとしました:
mSingleThreadScheduler = Schedulers.from(Executors.newSingleThreadExecutor());
と:
public Observable<List<Entity>> getEntities() {
invalidateCacheIfNeeded();
return Observable
.concat(cachedEntities(), networkEntities())
.subscribeOn(mSingleThreadScheduler)
.first();
}
ObservableチェーンでsubscribeOn
コールを振り下ろそうとしましたが、同じ結果が得られました。
ヒント?
のようになりますよう
あなたは
AsyncSubject<Data> mSubject
を作成し、それを使用する必要があります考えますあなたのメソッドの 'getEntities()'宣言で 'synchronized'キーワードを使用してください。スレッドロックで別のスレッドを許可する前に完了するように呼び出します。 –'concat()'呼び出しがブロックされていないので、 'getEntities'はほぼ即座に戻ります。この方法では 'synchronized'メソッドは動作しません。 – fstephany
しかし、 'concat()'がブロックされていなくても、 'getEntities()'を呼んでいるものは呼び出しからの戻りを待っている間にブロックされますか?だから、もしあなたが複数回呼び出されないようにしようとしていたら、この呼び出しでは 'synchronized'がうまくいくと思います。私は何かが欠けていない限り。タスクが終了していない場合、どのようにすぐに戻ることができますか?たぶん私はここでおしゃべりをすることができます。 –