Реализовать разделяемый Flowable в RxKotlin с динамическими параметрами
Ничто из того, что я пробовал, похоже, не решило мою проблему.
У меня есть три кнопки с поведением onClick. Каждая из этих кнопок вызывает один и тот же метод launchActivity
но с разными параметрами. launchActivity
делает IO с переменными, полученными от onClick
методы, а затем возвращает намерение. Я хотел бы иметь возможность реализовать RxKotlin/Java Flowable для совместной обработки противодавления между тремя методами onClick, чтобы я мог реализовать BackpressureStrategy.DROP
, Так что если onClick1
был инициирован onClick2
будет отброшен, если начато время launchActivity
все еще обрабатывал onClick1
на io()
нить.
class ActivityLauncher {
fun onClick1() {
val intent = launchActivity(inFile1, outFile1)
startActivity(intent)
}
fun onClick2() {
val intent = launchActivity(inFile2, outFile2)
startActivity(intent)
}
fun onClick3() {
val intent = launchActivity(inFile3, outFile3)
startActivity(intent)
}
fun launchActivity(in: File, out: File): Intent {
// do IO with in and out files and create an intent
return intent
}
}
Если бы я реализовал это, как, скажем, Single, я бы реализовал onClick
методы вроде как:
fun onClick() {
Single.fromCallable(launchActivity(inFile, outFile)
.observeOn(scheduler.io())
.subscribeOn(scheduler.ui())
.subscribe { i -> startActivity(i) }
}
Но я не могу понять, как позвонить launchActivity
из общего потока, который доступен для всех трех onClick
методы, все еще позволяя им пройти в их уникальном inFile
а также outFile
Переменные и обеспечение противодавления.
Основные критерии:
- обеспечивать
launchActivity
работает наio()
нить - Передайте уникальные аргументы от каждого из
onClick
методы дляlaunchActivity
каждый разonClick[#]
это запустить. BackpressureStrategy.DROP
используется для обеспечения обработки только первого клика в серииlaunchActivity
- Результирующий
intent
отlaunchActivity
передаетсяstartActivity
Как реализовать Flowable, чтобы разрешить такое поведение?
1 ответ
На самом деле это не нужно делать реактивно, кажется, что вы используете его из-за удобства многопоточности - в этом нет ничего плохого, однако это вызывает сложности, когда вы пытаетесь смоделировать ситуацию с использованием Rx.
Single
правильный оператор для использования - вы хотите только 1 эмиссию (BackpressureStrategy.DROP
в Flowable
будет по-прежнему испускать предметы нисходящего потока, если они могут идти в ногу Вам просто нужно сделать свои кнопки isClickable = false
в начале вашего onClick()
и установите затем обратно к isClickable = true
- что-то вроде:
Single.fromCallable { launchActivity(inFile, outFile) }
.doOnSubscribe { disableButtonsFunction() }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doFinally { enableButtonsFucntion() }
.subscribe { i -> startActivity(i) }