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)
    )
)