Есть ли реальные преимущества в применении реактивного программирования для элементов пользовательского интерфейса на Android? - PullRequest
2 голосов
/ 07 февраля 2020

Я пытаюсь использовать шаблон реактивного наблюдателя в моем проекте и наткнулся на библиотеку RxBinding . Некоторые утверждают, что преимущества реактивного шаблона реализации пользовательского интерфейса следующие:

  • Меньше шаблонного кода
  • Согласованный шаблон
  • И более читаемый код

Но мне было интересно есть ли другие преимущества, такие как более плавный пользовательский интерфейс, лучшая производительность или меньшее использование памяти и т. Д. c ... что потенциальный конечный пользователь или устройство, на котором запущено программное обеспечение, могут возможно, спасибо вам за , а не за те преимущества, о которых говорилось выше, которые кажутся разработчикам полезными.

Более важно, есть ли какие-либо недостатки в этом шаблоне?

И поскольку я вентилятор Kotlin, есть ли другой способ получить те же преимущества, используя языковые функции Kotlin или Android KTX?

Источники:

1 Ответ

1 голос
/ 07 февраля 2020

Одной из основных причин, по которой Rx становится популярным на android, является java 7 (отсутствие коллекций, потоковых api и lambdas). В сочетании со старым плагином retrolambda (задача desugar позже) Rx предоставляет java 7 всех потоковых функций и разновидностей функционального программирования.

Теперь у нас есть kotlin, которые предлагают более лучший функциональный стиль с отличным стандартным API (потоки включительно). Теперь kotlin в сочетании с сопрограммами и flow api может заменить старые подходы Rx.

Конечно, Rx Java нельзя полностью заменить функциональностью kotlin , у них есть много полезных операторов, таких как throttle, сцепление, zip, share, combLatest et c ... Для сложных потоковых логи c Rx Java наверняка превосходит kotlin функций.

Вернемся к RxBinding ... множество простых библиотек logi c теперь можно заменить синтаксисом kotlin, и вот несколько примеров:

infix fun <V : View> V.onClick(block: V.() -> Unit) = setOnClickListener { block(it as V) }

myCheckboxView onClick { isChecked = !isChecked }
fun EditText.onTextChange(block: (String) -> Unit) {
    this.addTextChangedListener(object: TextWatcher {
        override fun afterTextChanged(s: Editable?) { block(s.toString()) }
        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
    })
}

myEditText.onTextChange(this::printTheText)

Но если вам нужно больше мощных API для работы с событиями в паре вам следует выбрать RxBinding:

myButton.clicks()
            .withLatestFrom(myBotton2.clicks(), editText.textChanges().skipInitialValue(), { ... })
            .filter { it.locale != null }
            .zipWith(detectLocation.text(), { ... })
            .doOnNext(::maybeLog)
            .subscribe(
                    this::handleSuccess,
                    this::handleError
            )

RxBindings не должен влиять на производительность пользовательского интерфейса на современных устройствах https://blog.newrelic.com/technology/android-art-vs-dalvik/. Rx Java предполагает использование большого количества анонимных классов, а у G C будет больше работы и утечек памяти в случае проблем в вашем коде.

...