Android: какую осторожность следует соблюдать при использовании свойства ViewTag ()? - PullRequest
4 голосов
/ 13 октября 2009

Поскольку Java использует ссылки на объекты, а не сами объекты, что мешает мне использовать setTag (), чтобы пометить представление целым объектом вместо свойства объекта? Это просто время поиска атрибута при попытке разрешить один из атрибутов после вызова getTag () или есть какие-то другие конкретные вещи, о которых я должен беспокоиться?

Что касается моей конкретной проблемы, я использую пользовательский просмотр списка, который имеет просмотр изображений и просмотр текста. Сначала я привязываю просмотр списка к пользовательскому адаптеру, чтобы получить некоторые данные XML, а затем использую определенные теги внутри каждого элемента XML для заполнения моего списка. Таким образом, «весь объект», на который я ссылался, был разобранной версией всего XML элемента ...

Ответы [ 2 ]

4 голосов
/ 13 октября 2009

Одним из самых популярных применений метода setTag(Object) является точное сохранение ссылки на экземпляр класса - если вы использовали пользовательский ListView и пользовательский Adapter, вы должны знать о шаблоне ViewHolder.

Не зная о вашей конкретной проблеме, я бы сказал - иногда это опасно? Да, если используется безответственно. Означает ли это, что вы должны избегать этого любой ценой? Нет, абсолютно нет.

Редактировать : Почему вы хотите, чтобы проанализированные данные для ваших представлений были привязаны к ним?

Вам это действительно нужно, или вы можете заполнить какую-то модель? Если вы хотите получить доступ к тегу представления в контексте, где ваше представление не имеет того же значения / позиции (как convertView в нашем любимом примере ViewHolder :)), я думаю, использование тегов - это нормально.

В противном случае, я уверен, что если вы уделите этому немного больше внимания, вы найдете другой подход, более подходящий для вашей проблемы.

1 голос
/ 01 сентября 2011

Есть два API для settag, один с просто значением, а другой с ключом и значением. Первый API очень безопасен, но вы должны быть очень осторожны при использовании второго API.

Внутренне в View.java Android поддерживает статическое представление отображения хэш-карты в разреженный массив. Ключ и значение, переданные в settag, сохраняются в разреженном массиве. Есть две важные вещи, которые необходимо учитывать.

Сначала не сохраняйте объект значения, имеющий какую-либо ссылку на действие. Это приведет к утечке памяти, поскольку активность будет иметь сильную ссылку на значение, а значение будет иметь сильную ссылку на статический хэш-файл, поддерживаемый View.class.

Во-вторых, каждый внутренний поиск gettag должен искать hashmap и разреженный массив. Что не очень эффективно.

Спасибо Сурия.

...