RecyclerView를 사용할 때 정확히 인지하지 못하는 상태에서 빈번하게 발생할 여지가 있는 안티패턴들이 있다.
안티패턴으로 인해 성능 저하나 비정상적인 동작을 유발하게 되는데, 이런 아티패턴을 피해 RecyclerView의 효율성과 안정성을 유지할 수 있다.
1. ViewHolder 재사용 무시
문제점
RecyclerView의 가증 큰 장점 중 하나는 ViewHolder의 재사용이다. ViewHolder를 재사용하지 않고, 매번 새로운 View를 생성하거나 findViewById를 자주 호출하면 성능이 저하된다.
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
// 매번 findViewById 호출
val textView = holder.itemView.findViewById<TextView>(R.id.textView)
textView.text = data[position]
}
해결법
ViewHolder 내부에서 뷰를 미리 바인딩하고, onBindViewHolder에서 해당 뷰를 재사용한다.
2. 뷰 내에서 뷰의 상태 변화
문제점
아이템이 재사용될 때마다 ViewHolder에서 레이아웃을 동적으로 변경하면 성능이 크게 저하될 수 있다. 특히, 자식 뷰의 노출 상태나 레이아웃을 반복적으로 변경하는 것
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
if (position % 2 == 0) {
holder.itemView.visibility = View.GONE
} else {
holder.itemView.visibility = View.VISIBLE
}
}
해결법
레이아웃의 상태 변경이 필요하다면 RecyclerViewAdapter에 들어가는 데이터 클래스에서 visibility와 비슷한 변수값을 지정해주는것이다.
이렇게 되면 visibility 변수를 통해 개별 ItemView의 일부 View 노출 상태가 보이는지 안보이는지 판단할 수 있다.
3. 무거운 연산 수행
문제점
onBindViewHolder나 onCreateViewHolder 메소드에서 불필요하게 무거운 연산(예: 이미지 로딩, 데이터베이스 조회)을 수행하면 UI 스레드가 차단되어 성능이 저하된다.
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val bitmap = BitmapFactory.decodeFile(imagePath)
holder.imageView.setImageBitmap(bitmap)
}
해결법
무거운 연산은 백그라운드에서 처리하고, 결과를 UI 스레드에 전달해 업데이트합니다.
예를 들어, Glide나 Picasso와 같은 라이브러리를 사용해 이미지 로딩을 처리할 수 있습니다.
4. ViewHolder 내에서 Context의 잘못된 사용
문제점
ViewHolder 내에서 Context를 잘못 참조하면 메모리 릭이 발생할 수 있습니다.
특히 액티비티의 Context를 사용하면 액티비티가 종료된 후에도 메모리에서 해제되지 않을 수 있습니다.
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val context = itemView.context // Context 저장
}
해결법
Context는 필요한 순간에만 사용하고, 뷰나 어댑터에 지속적으로 참조하지 않도록 합니다.
요약
RecyclerView를 사용할 때는 성능 최적화와 코드의 유지보수성을 위해 위의 안티패턴을 피하고, 올바른 방법으로 구현하는 것이 중요합니다.
ViewHolder의 재사용성, 효율적인 상태 업데이트, 불필요한 연산 회피, 메모리 관리 등을 고려하여 최적의 사용자 경험을 제공할 수 있습니다.
'Android' 카테고리의 다른 글
[Android] TelephonyManager를 통해 USIM 데이터 추출하기 (0) | 2024.10.31 |
---|---|
[Android] API KEY 안전하게 관리하기 (Kotlin DSL) (0) | 2024.09.05 |
[Android] Compose remember 간단 요약 (0) | 2024.07.17 |
[Android] 시스템 설정 변경 처리하기 (0) | 2024.06.25 |
[Android] ViewModel에서 LiveData와 StateFlow의 권장 사용 방법 (0) | 2024.06.20 |