본문 바로가기
ANDROID/Android 개발 이슈 & 해결

[Android] Kotlin Android Extensions deprecated

by 주 녕 2021. 3. 30.
728x90

시간이 좀 지난 일이지만 개발 방식을 조금 바꾸게 되어 정리해본다.

안드로이드 4.1 버전에서 새로운 프로젝트 생성 시 기본 플러그인으로 제공하던

apply plugin: 'kotlin-android-extensions'이 제거되고, 기본 'com.android.application'과 'kotlin-android'만 남게 되었음

 

그렇다면 왜 deprecated되었을까?

  • 내부적인 캐시를 통해 재사용성을 높인 것
  • RecyclerView의 ViewHolder에서는 이 재사용성이 지켜지지 않음
    • 디컴파일을 해보지 않으면 알 수 없기 때문에 상당히 많은 개발자가 놓치고 그대로 활용

< 기존의 ViewHolder >

class SampleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    fun onBind() {
        itemView.btn.setOnClickListener {
        }
    }
}

< 디컴파일한 코드>

public final void onBind() {
   View var10000 = this.itemView;
   Intrinsics.checkNotNullExpressionValue(var10000, "itemView");
 ((Button)var10000.findViewById(id.btn)).setOnClickListener((OnClickListener)null.INSTANCE);
}

_findCachedViewById를 사용하지 않고 findViewById를 사용하고 있음

== onBind()를 호출할 때마다 findViewById를 매번 하는 것

: 재사용성을 높여야 하는 RecyclerView.ViewHolder에서 이를 제공하지 않고 있음

 

  • 실수가 생길 여지가 많음 (동일한 id를 가진 서로 다른 widget)
    • 해당 레이아웃에서만 사용하는 widget만 추천하는 것이 아니라 모든 레이아웃의 widget이 추천됨
    • 이런 경우에는 런타임 오류가 발생
  • 실수가 생길 여지가 많음 (동일한 id를 가진 같은 widget)
    • 이름만 명확하면 문제를 해결할 수 있고, 사소한 문제이지만 나중에 이슈가 터질 수도 있음
    • import와 include를 사용하게 되는 경우 발생할 수 있음
    • 이 경우에는 정상 동작을 함

 

ViewBinding

findViewById를 쓰지 않고,

XML의 view component에 접근하는 object(Android studio에서 자동 생성)를 반환받아 view에 접근하는 방식

 

장점

  • NULL safety
    • 잘못된 id를 대입하여 null pointer 오류가 발생하는 등의 문제가 일어나지 않음
  • Type safety
    • 바인딩 클래스 내 필드는 레이아웃 내 선언된 뷰의 타입을 갖음.
    • 따라서 잘못된 타입으로 캐스팅하는 실수를 원천 봉쇄함

 

 


참고

 

728x90

댓글