Android — findViewById() против findViewWithTag()

#java #android

#java #Android

Вопрос:

При написании большого приложения, имеющего много представлений (и, как следствие, много идентификаторов),
что является лучшей практикой или лучше с точки зрения производительности;
Иметь много идентификаторов и находить их с findViewById(X)
помощью или иметь несколько тегов и находить представления с помощью findViewWithTag(Y) ?

Комментарии:

1. Я хотел бы знать, почему я был отклонен

Ответ №1:

Что касается лучшей практики, используйте один или оба (обычно оба) в зависимости от требований приложения. На вашем месте я бы больше заботился о удобстве использования и группировке, чем о производительности (поскольку приложение большое и может стать недоступным для обслуживания).

Согласно этой части документов Android :

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

Основная цель тегов в Android — сделать группировку кода более чистой. Подумайте об этом как о маркировке товаров в супермаркете категориями: продукты питания, электроника и т.д… Я думаю, что использование тегов в лучшем случае окажет минимальное влияние на производительность.

Однако описанные ниже методы окажут гораздо большее влияние на производительность, чем отказ от использования тегов / представлений или обоих.

Если вы хотите повысить производительность,

Ответ №2:

findViewWithTag() определяется только для представления. Тем не менее, findViewById() можно использовать для просмотра и действий.

Я считаю, что findViewById() это наилучшие методы доступа к представлениям. Даже вы должны использовать Butterknife http://jakewharton.github.io/butterknife / для доступа к представлениям.

Производительность: findViewById() быстрее, чем findViewWithTag() потому, что сравнение int быстрее, чем String.equals() .

View.java

 protected View findViewTraversal(@IdRes int id) {
    if (id == mID) {
        return this;
    }
    return null;
}

protected View findViewWithTagTraversal(Object tag) {
    if (tag != null amp;amp; tag.equals(mTag)) {
        return this;
    }
    return null;
}