Vamos supor que eu tenha uma atividade mostrando as postagens RecyclerView
dentro e dentro dessa atividade, há um botão de atualização.
Quando o usuário clicou no botão de atualização eu vou me conectar com o servidor para receber as postagens novamente.
Vamos supor que o usuário clicou no botão de atualização e durante a tentativa de obter as postagens do servidor, o usuário clicou no botão de atualização novamente 16 vezes, isso fará com que se conecte com o servidor 17 vezes.
Tentei resolver esse problema usando BackpressureStrategy.DROP
inside repeatWhen
mas BackpressureStrategy.DROP
não cai as conexões durante a obtenção dos posts do servidor.
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
tem um valor de pré-busca padrão de 128 e um mínimo de 1 para que sempre haja uma repetição a ser acionada.
Se você quiser que o assunto seja considerado apenas quando a sequência interna estiver pronta para repetir/repetir, use flatMap
:
.repeatWhen(f ->
f.flatMap(e -> repeatSubject
.toFlowable(BackpressureStrategy.DROP)
.take(1)
)
)
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras