2009-10-13 3 views
4

자바는 객체 참조가 아니라 객체 자체를 사용하기 때문에 객체의 속성 대신 전체 객체로 태그를 지정하는 setTag()를 사용하지 못하게하는 이유는 무엇입니까? getTag() 호출 후 속성 중 하나를 해결하려고 할 때 속성 조회 시간인가, 아니면 걱정해야 할 다른 특정 항목이 있습니까?Android :보기의 setTag() 속성을 사용할 때 어떤주의를 기울여야합니까?

내 구체적인 문제는 imageview 및 textview가있는 사용자 지정 listview를 사용하고 있습니다. 처음에는 목록 뷰를 사용자 지정 어댑터에 바인딩하여 일부 XML 데이터를 가져온 다음 각 항목의 XML 내 특정 태그를 사용하여 목록 뷰를 채 웁니다. 그래서 내가 언급 한 "전체 객체"는 아이템의 전체 XML을 구문 분석 한 버전입니다 ...

답변

4

setTag(Object) 메소드의 가장 많이 사용되는 기능 중 하나는 클래스 인스턴스에 대한 참조를 정확하게 유지하는 것입니다. 사용자 정의 ListView 및 사용자 정의 Adapter을 사용하면 ViewHolder 패턴에 대해 알아야합니다.

귀하의 특정 문제에 대해 많이 알지 못하면서, 나는 때때로 이렇게 위험한가요? 무책임하게 사용하면 예. 이것은 당신이 그것을 피해야한다는 것을 의미합니까? 아니, 절대적으로.

편집 : 왜 뷰에 구문 분석 된 데이터를 바인딩하고 싶습니까?

정말 필요한가요? 아니면 어떤 유형의 모델을 채울 수 있습니까? 컨텍스트 내에서 뷰의 태그가 동일한 의미/위치를 가지고 있지 않은 경우 (예 : convertView이 우리가 가장 좋아하는 ViewHolder 예제에서와 같이 :)), 태그 사용은 괜찮다고 생각합니다.

그렇지 않으면, 당신이 조금 더 생각한다면, 당신은 당신의 문제에 더 잘 맞는 또 다른 접근법을 발견 할 것입니다.

+0

예. ViewHolder 패턴에 대해 들어 봤습니다. 고마워요 ... 그건 안심입니다 ... 내 문제에 대해, 나는 방금 위에 내 질문을 업데이트했습니다 ... – Legend

+0

그 항목 설명은 어떤 항목이 보입니까에 따라 변경 유지. 따라서 일부 정보를 의도에 전달해야하는 경우 고려해야 할 특정 항목에 대한 추가 정보가 필요합니다. 물론, 나는 전체 항목을 전달하겠다고 말하면서 과장된 듯하지만, 하나 또는 두 개의 속성만으로도 좋습니다. 하지만 성능 측면에서 알고 싶었습니다 ... 답장을 보내 주셔서 감사합니다 ... – Legend

1

값이 설정된 태그 태그에는 두 개의 api가 있고, 키와 값은 두 개의 api가 있습니다. 첫 번째 API는 매우 안전하지만 두 번째 API를 사용할 때는 매우주의해야합니다.

View.java에서 내부적으로 Android는 정적 해시 맵 매핑보기를 스파 스 배열에 유지 관리합니다. settag에 전달 된 키와 값은 희소 배열에 저장됩니다. 고려해야 할 중요한 두 가지 사항이 있습니다.

먼저 활동에 대한 참조가있는 값 개체를 저장하지 마십시오. 이것은 액티비티가 값으로부터 강력한 참조를 가지며 값이 View.class에 의해 유지되는 정적 해시 맵으로부터의 강력한 참조를 가지므로 메모리 누수가 발생합니다.

두 번째로 gettag를 조회 할 때마다 내부적으로 해시 맵과 스파 스 배열을 조회해야합니다. 그다지 효율적이지 않습니다.

감사합니다. Suriya.