ANDROID/Android 개발 이슈 & 해결
[Android] Kotlin Android Extensions deprecated
주 녕
2021. 3. 30. 17:22
반응형
시간이 좀 지난 일이지만 개발 방식을 조금 바꾸게 되어 정리해본다.
안드로이드 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
- 바인딩 클래스 내 필드는 레이아웃 내 선언된 뷰의 타입을 갖음.
- 따라서 잘못된 타입으로 캐스팅하는 실수를 원천 봉쇄함
참고
- thdev.tech/android/2020/10/07/Remove-kotlinx-synthetic/
- tourspace.tistory.com/314
- medium.com/androiddevelopers/use-view-binding-to-replace-findviewbyid-c83942471fc
반응형