问题描述
我在 Android 应用程序中将 RxJava 与 Kotlin 一起使用。避免使用 throttleFirst 方法对我在Rxava上按如下方式处理的按钮多次单击。
compositedisposable = new Compositedisposable();
@OnClick(R.id.f1rst_button)
fun onFirstButtonClick(view: View) {
Log.d("capture click event started")
compositedisposable.add(RxView.clicks(view).throttleFirst(500,TimeUnit.MILLISECONDS,AndroidSchedulers.mainThread())
.subscribe {
Log.d("capture click event accepted")
performFirstButtonClick()
})
}
但是,始终是,屏幕初始化后缺少第一次单击按钮。从第2次点击开始,其工作正常。
例如:启动屏幕->等待屏幕加载->单击按钮,然后等待操作->在此触发按钮单击事件并在日志语句Log.d("capture click event started")
中打印。但是performFirstButtonClick()
不会被触发,并且在加载屏幕后第一次也不会打印相应的日志。
请让我知道我是否做错了(或任何其他解决方案)。
More Info
:为了提供更多信息,我正在对此进行编辑。
此按钮在DialogFragment中。
流程如下
开始的活动A
->在按钮上单击活动A ,启动活动B (其中包含具有表格的 WebView >)
当用户通过 JavascriptInterfaceBridge 从活动B 中单击表单中的表单时,将打开-> 活动C 。 >
-> 活动C 包含一个按钮( onFirstButtonClick )。
活动A和活动B是 Java 文件,活动C是 kotlin 文件。问题与活动C 中的按钮有关。
解决方法
首先,在每次单击按钮时创建新的RX订阅,这是不必要的。
只需在点击侦听器上设置视图创建(例如,onCreate()
)后,就无需在此处使用ButterKnife
RxView.clicks(view)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe{
// Handle click listener
}.also {
// Just once add subscription to Composite Disposable container
compositeDisposable.add(it)
}
第二件事,如果要避免多次连续单击,建议操作员对.debounce(400,TimeUnit.MILLISECONDS)
进行反跳。使用此运算符,您可以在多次点击之间限制点击次数。