Реализовать разделяемый 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) }
Другие вопросы по тегам