BackpressureStrategy.DROP 没有按预期工作
BackpressureStrategy.DROP not working as I expected
假设我有一个 activity 显示 RecyclerView
中的帖子,并且在这个 activity 中有一个刷新按钮。
当用户点击刷新按钮时,我将连接服务器以再次获取帖子。
假设用户点击刷新按钮并尝试从服务器获取帖子,用户再次点击刷新按钮 16 次,这将导致与服务器连接 17 次。
我试图通过在 repeatWhen
中使用 BackpressureStrategy.DROP
来解决这个问题,但是 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,因此始终会触发一次重复。
如果您希望仅在内部序列准备就绪时才考虑主题 repeat/retry,请使用 flatMap
:
.repeatWhen(f ->
f.flatMap(e -> repeatSubject
.toFlowable(BackpressureStrategy.DROP)
.take(1)
)
)
假设我有一个 activity 显示 RecyclerView
中的帖子,并且在这个 activity 中有一个刷新按钮。
当用户点击刷新按钮时,我将连接服务器以再次获取帖子。
假设用户点击刷新按钮并尝试从服务器获取帖子,用户再次点击刷新按钮 16 次,这将导致与服务器连接 17 次。
我试图通过在 repeatWhen
中使用 BackpressureStrategy.DROP
来解决这个问题,但是 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,因此始终会触发一次重复。
如果您希望仅在内部序列准备就绪时才考虑主题 repeat/retry,请使用 flatMap
:
.repeatWhen(f ->
f.flatMap(e -> repeatSubject
.toFlowable(BackpressureStrategy.DROP)
.take(1)
)
)