Нажатие первой кнопки пропущено после инициализации экрана классом Rxjava kotlin

#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) . С помощью этого оператора вы будете регулировать количество нажатий в промежутке между несколькими щелчками.