🚨 Trouble Shooting
다음과 같이 context를 매개변수로 전달받는 클래스를 TestActivity에서 호출할 때 다음과 같은 에러가 발생했습니다. 파란 줄을 보시면 context를 전달받을 때 null이 전달되어 NullPointerException 이 발생했습니다.
class FusedLocationProvider (
private val context: Context,
private val listener: OnLocationUpdateListener
)
class TestActivity: AppCompatActivity(), OnLocationUpdateListener {
private var fusedLocationProvider = FusedLocationProvider(this, this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test)
}
}
원인을 파악하면서 TestActivity Class에서 FusedLocationProvider( ) Class를 생성할 때 분명 context 객체를 전달해 줬는데 Null이 전달된 이유에 대해 생각하다 이런 생각이 들었습니다.
Activity가 완전히 생성되기 전에 this를 사용하면 context가 생성 되지 않지 않을까?
FusedLocationProvider( ) 의 매개변수로 전달되는 context는 액티비티에서 사용할 경우 this 지시어를 사용해 전달하는데 이 this는 TestActivity의 인스턴스를 의미합니다. 안드로이드 액티비티의 경우, onCreate() 메서드가 호출되기 전에는 액티비티가 완전히 생성되지 않았기 때문에 액티비티의 인스턴스를 사용할 수 없습니다.
그래서 이 액티비티가 완전히 생성되기 전에 클래스를 TestActivity의 프로퍼티로 생성해 문제가 발생했던 것이었습니다.
지연 초기화를 사용하면 TestActivity의 인스턴스가 생성된 후에야 프로퍼티에 값을 할당할 수 있으므로 이러한 문제를 방지할 수 있습니다.
class TestActivity: AppCompatActivity(), OnLocationUpdateListener {
private lateinit var fusedLocationProvider: FusedLocationProvider
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test)
fusedLocationProvider = FusedLocationProvider(this, this)
}
안드로이드를 공부한 지 1년 만에 알게 된 사실입니다. 별거 아닌 거 같아도 옛날이었으면 생각도 못했을 탠데 클래스와 프로퍼티의 구조를 정확히 이해하게 된 거 같아서 뿌듯하네요 🤗
'Android' 카테고리의 다른 글
ViewLifeCycleOwner 제대로 알고 사용해보자 (1) | 2024.04.28 |
---|---|
Room Like + StateFlow debouce와 Throttle (0) | 2024.03.31 |
[Android] Room Database Migration (0) | 2024.01.21 |
[Android] Room TypeConverter (0) | 2024.01.21 |
[Android] Room Database (0) | 2024.01.21 |