Android Data Binding Library vs Kotlin Android Extensions

Я читаю о том, как работает MVVM-архитектура и как использовать библиотеку привязки данных Android.

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

Kotlin Android Extensions - еще один плагин Kotlin, который позволит вам восстанавливать представления из "Действия", "Фрагменты и представления". Плагин создаст дополнительный код, который позволит вам просматривать представления в макете XML, точно так же, как если бы они были свойствами с именем идентификатора, используемого в определении макета.

В чем разница между использованием Android Data Binding Library и Kotlin Android Extensions? Являются ли они для разных целей? Дополняют ли они друг друга, каким образом?

Спасибо за ответ.

Ответ 1

Оба, Kotlin Android Extensions и Android Data Binding Library, помогают исключить использование findViewById.

Но есть и другие вещи, которые могут дополнять друг друга. Для уточнения, с помощью библиотеки Android Data Binding вы можете "задавать" модели в своих XML файлах, которые затем можно напрямую использовать для установки значений для представлений в макете. Посмотрите, как <data> можно использовать с библиотекой привязки данных.

Расширения Kotlin для Android не предусматривают этого. В то же время расширения Kotlin для Android предоставляют некоторые удивительные функции, такие как аннотация @parcelize чтобы сделать классы пригодными для разделения практически без стандартного кода и т.д.

В заключение, хотя они оба исключают использование findViewById, они также имеют свои собственные функции, которые могут хорошо дополнять друг друга.

Ответ 2

Расширения Kotlin Android не означают только привязку просмотра. Он содержит и другие функции. Но я предполагаю, что вы говорите о возможностях привязки/кэширования представлений в Kotlin Android Extensions и задаетесь вопросом, нужно ли нам по-прежнему связывать данные, поскольку мы уже избавились от вызовов findViewById с помощью синтетических свойств Kotlin. Это был вопрос, который я задал себе, и мой вывод: да, привязка данных все еще стоит использовать.

Из официальной документации:

Библиотека привязки данных создает неизменяемое поле в классе привязки для каждого представления, у которого есть идентификатор в макете... Библиотека извлекает представления, включая идентификаторы, из иерархии представлений за один проход. Этот механизм может быть быстрее, чем вызов метода findViewById() для каждого представления в макете.

Таким образом, привязка данных не вызывает findViewById для представлений один за другим. С другой стороны, синтетические классы Kotlins по-прежнему вызывают findViewById для представлений под капотом, но вызывают их только один раз для каждого представления и кэшируют ссылку на представление для следующих вызовов. (Вот статья об этом)

Кроме того, привязка данных может предложить не только кэширование представления. Вы можете использовать теги данных для передачи данных в реализацию привязки и объявить их в своем XML, вместо того, чтобы устанавливать их программно. Таким образом, вы можете избавиться от стандартного кода, который вы используете для заполнения данных, таких как "setText", "setImageResource" и т.д. Вы можете установить прослушиватели событий из xml, используя привязку данных. Вы также можете придумать свои собственные атрибуты с помощью пользовательских адаптеров привязки. При полном использовании он может значительно сократить ваш код Java/Kotlin.

Изменение: Кажется, что команда Google Android рекомендует против использования синтетических свойств kotlin. Эта статья суммирует обсуждение вокруг этой проблемы. И вы можете увидеть в новом курсе Udacity, подготовленном Google, что они используют привязку данных в качестве рекомендуемой практики.

Ответ 3

Я категорически не согласен с пунктами, упомянутыми выше. возможно, потому что я ненавижу писать логику в XML. поэтому в обоих комментариях упоминается использование тегов <data> нет в Kotlin Android Extensions (KTX). с Kotlin и KTX вы можете сделать лучше, чем тег данных.

скажем у нас есть

data class Person(val name:String, 
                   val phone:String,
                   val isMale:Boolean,
                   val isMarried:Boolean)

в деятельности или фрагменте мы можем сделать

fun updateView(data:Person){
    with(data){

     nameTextField.text = if(isMale){
                            "Mr. $name" 
                          } else {
                             if(isMarried){
                              "Mrs. $name"
                             }else{
                              "Miss $name"
                             }
                          }
     phoneTextField.text = phone
    }
 }

в привязке данных, вы должны сделать

android:text='@{person.isMale? "Mr."+user.name: ((user.isMarried? "Mrs. ": "Miss. ") + user.name)}'

Код KTX намного чище, чем то, что вы должны делать с привязкой данных для достижения того же результата. когда вам нужны условия для установки значений для просмотра, привязка данных становится ужасной. так что для меня Kotlin Android Extensions работают лучше. Мне нравится мой код чистый. Вы все еще можете использовать оба решения, которые принимаете сами.

Ответ 4

У меня есть вопрос о памяти, используемой в обоих случаях. В каком случае будет меньше памяти, используемой на устройстве?

  • Android-расширение Kotlin вызывает сначала findViewById, и после этого результат будет сохранен локально в улове. и это означает, что память используется.
  • DataBinding создает путь между макетами и действиями/фрагментами через созданный класс привязки. Моя задача - использовать тот, который более эффективен, когда мы думаем об использовании памяти на пользовательском устройстве. Может ли кто-нибудь помочь мне выяснить ответ? Я склонен говорить, что привязка данных более эффективна. Спасибо!