このアクティビティ内およびその中に投稿を表示するアクティビティがあるとしましょうRecyclerView
。更新ボタンがあります。
ユーザーが更新ボタンをクリックすると、サーバーに接続して投稿を再度取得します。
ユーザーが更新ボタンをクリックし、サーバーから投稿を取得しようとしているときに、ユーザーが更新ボタンをもう一度16回クリックしたとすると、サーバーに17回接続されます。
BackpressureStrategy.DROP
内部を使用してこの問題を解決しようとしましrepeatWhen
たがBackpressureStrategy.DROP
、サーバーから投稿を取得するときに接続が切断されません。
PublishSubject<String> retrySubject = PublishSubject.create();
PublishSubject<String> repeatSubject = PublishSubject.create();
new Retrofit.Builder()
.baseUrl("...")
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(API.class)
.getPosts()
.repeatWhen(objectFlowable -> objectFlowable.zipWith(repeatSubject.toFlowable(BackpressureStrategy.DROP), (o, s) -> s))
.retryWhen(throwableFlowable -> throwableFlowable.zipWith(retrySubject.toFlowable(BackpressureStrategy.DROP), (throwable, s) -> s))
.subscribe();
//repeatSubject.onNext("") inside refresh button
//retrySubject.onNext("") inside retry button
zipWith
デフォルトのプリフェッチ量は128で、最小値は1であるため、トリガーされるリピートは常に1つです。
内部シーケンスを繰り返す/再試行する準備ができたときにのみサブジェクトを考慮したい場合は、次を使用しますflatMap
。
.repeatWhen(f ->
f.flatMap(e -> repeatSubject
.toFlowable(BackpressureStrategy.DROP)
.take(1)
)
)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加