Реализовать разделяемый Flowable в RxKotlin с динамическими параметрами - PullRequest
0 голосов
/ 06 мая 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 08 мая 2018

Это на самом деле не нужно делать реактивно, похоже, что вы используете его из-за удобства многопоточности - в этом нет ничего плохого, однако это вызывает сложности, когда вы пытаетесь смоделировать ситуацию с использованием 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) }
...