Реализовать общий Flowable в RxKotlin с динамическими параметрами

Ничто из того, что я пробовал, не решает мою проблему.

У меня есть три кнопки с поведением onClick. Каждая из этих кнопок вызывает один и тот же метод launchActivity, но с разными параметрами. launchActivity выполняет некоторые операции ввода-вывода с переменными, полученными из методов 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 из общего Flowable, доступного для всех трех методов onClick, при этом позволяя им передавать свои уникальные переменные inFile и outFile и применяя обратное давление.

Основные критерии:

  • Убедитесь, что launchActivity запущен в потоке io()
  • Передайте уникальные аргументы из каждого из методов onClick в launchActivity при каждом запуске onClick[#].
  • BackpressureStrategy.DROP используется для обеспечения того, чтобы только первый клик в серии обрабатывался в launchActivity
  • Полученный intent из launchActivity передается в startActivity

Как мне реализовать Flowable, чтобы разрешить такое поведение?


person Dan 0    schedule 06.05.2018    source источник


Ответы (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) }
person Mark Keen    schedule 07.05.2018