1

我尝试过的任何方法似乎都无法解决我的问题。

我有三个具有 onClick 行为的按钮。这些按钮中的每一个都调用相同的方法launchActivity,但具有不同的参数。launchActivity对从方法接收到的变量进行一些 IO,onClick然后返回一个意图。我希望能够实现一个 RxKotlin/Java Flowable 来共同处理三个 onClick 方法的背压,这样我就可以实现BackpressureStrategy.DROP. 因此,如果在仍在线程上处理的情况下启动,则如果onClick1启动onClick2将被丢弃。launchActivityonClick1io()

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同时仍然允许它们传递它们的唯一变量inFileoutFile变量并强制执行背压。

基本标准是:

  • 确保launchActivityio()线程上运行
  • onClick将每个方法的唯一参数传递给launchActivity每次onClick[#]运行。
  • BackpressureStrategy.DROP用于确保仅处理系列中的第一次点击launchActivity
  • 结果intentfromlaunchActivity被传递给startActivity

如何实现 Flowable 以允许这种行为?

4

1 回答 1

0

这实际上并不需要以被动的方式完成,似乎您正在使用它是因为线程的便利性 - 这没有错,但是当您尝试使用 Rx 对您的情况进行建模时,它会带来复杂性。

Single是要使用的正确运算符 - 您只需要 1 个发射(如果能够跟上BackpressureStrategy.DROP,a中仍会发射下游项目)。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) }
于 2018-05-07T23:48:52.797 回答