使用动态参数在RxKotlin中实现共享的Flowable

时间:2018-05-06 20:08:38

标签: android rx-java2 rx-android rx-kotlin2

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

我有三个带有onClick行为的按钮。这些按钮中的每一个都调用相同的方法launchActivity但具有不同的参数。 launchActivity使用从onClick方法接收的变量执行一些IO,然后返回一个intent。我希望能够实现一个RxKotlin / Java Flowable来集中处理三个onClick方法的背压,以便我可以实现BackpressureStrategy.DROP。因此,如果onClick1已启动onClick2,则launchActivityonClick1线程上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 } } 时仍会被删除。

onClick

如果我要像单身一样实现这一点,我实施fun onClick() { Single.fromCallable(launchActivity(inFile, outFile) .observeOn(scheduler.io()) .subscribeOn(scheduler.ui()) .subscribe { i -> startActivity(i) } } 方法有点像:

launchActivity

但是,我无法弄清楚如何从共享的Flowable中调用onClick,这可以被所有三种inFile方法访问,同时仍然允许它们传递其唯一的outFilelaunchActivity变量并强制执行背压。

基本标准是:

  • 确保在io()主题
  • 上运行onClick
  • 每次运行launchActivity时,将每个onClick[#]方法的唯一参数传递给BackpressureStrategy.DROP
  • launchActivity用于确保仅在intent
  • 中处理系列中的第一次点击
  • launchActivity生成的startActivity传递给{{1}}

如何实现Flowable以允许此行为?

1 个答案:

答案 0 :(得分:0)

这并不是真的需要以反应的方式完成,看起来你正在使用它,因为线程的便利性 - 没有任何问题,但是当你尝试建模时会带来复杂性使用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) }