#android #kotlin #rx-java2 #buttonclick
#Android #kotlin #rx-java2 #нажатие кнопки
Вопрос:
Я использую RxJava с Kotlin в своем приложении для Android. чтобы избежать многократных продолжений нажатия на кнопку, я обработал, как показано ниже, с помощью Rxava, используя метод throttleFirst.
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
: просто чтобы предоставить больше информации, я редактирую это. Эта кнопка находится в диалоговом окне. поток, как показано ниже, запустил действие A
-> при нажатии кнопки в действии A запускается действие B (которое содержит WebView с формой)
-> Действие C будет открыто, когда пользователь нажмет на кнопку в форме из действия B через JavascriptInterfaceBridge
-> Действие C содержит кнопку (onFirstButtonClick).
Здесь действие A и действие B — это файлы Java, а действие C — это файл kotlin. проблема связана с этой кнопкой в действии C.
Ответ №1:
Прежде всего, вы создаете новую подписку RX при каждом нажатии кнопки, в этом нет необходимости. Здесь вам не нужно использовать ButterKnife, сразу после создания представления (например onCreate()
), установленного на прослушивателе щелчков с:
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)
}
Во-вторых, если вы хотите избежать многократных повторных нажатий, я предлагаю отключить operator .debounce(400,TimeUnit.MILLISECONDS)
. С помощью этого оператора вы будете регулировать количество нажатий в промежутке между несколькими щелчками.