이번 니차내차 서비스에 지도가 필요해서, 한국인 정서에 가장 적합하다고 판단된(?) 네이버 지도를 사용하기로 했다.
프로젝트에 적용하면서 문제가 생겼던 부분들에 대해 정리하고 넘어가기로 했다.
지도를 사용하는데에는 MapFragment
와 MapView
두 가지 방법이 있다.
MapFragment는 지도 View를 포함한 Fragment이고, MapView는 FrameLayout으로 구현한 지도 View이다.
그래서 지도는 결국 생명주기에 맞춰서 설계가 되어있고, 실제 내부 코드를 보면 생명주기에 맞춰서 해야할 작업들(예를 들면, 지도 그리는 세팅, 옵션 세팅 등)을 하고 있다.
네이버 지도 공식문서에서 다음과 같이 언급하고 있다.
MapView
를 사용할 때는 반드시MapView
가 포함된 액티비티의 라이프 사이클에 맞추어onCreate()
,onStart()
,onResume()
,onPause()
,onStop()
,onDestroy()
,onSaveInstanceState()
,onLowMemory()
를 호출해야 합니다.
위에서 봤듯이 내부에서 작업을 하고 있기 때문에 설정을 해주어야 한다.
하지만 여기서 문제가 생긴다.
지금까지 우리가 알고 있는 내용을 살펴보도록 하자.
위의 두 내용 덕분에 나는 onDestroyView를 아래와 같이 코드를 짰다.
override fun onDestroyView() {
super.onDestroyView()
binding.mapView.onDestroy()
}
// 우리 프로젝트에서는 BaseFragment를 사용하기 때문에 약식으로 아래와 같이 작성했다.
BaseFragment.onDestroyView() {
override fun onDestroyView() {
super.onDestroyView() // Fragment의 onDestroyView 이다.
_binding = null
}
}
위와 같이 작성했더니, Fragment를 옮기거나, 화면 전환 등 onDestroyView가 불릴 때 binding이 먼저 해제되면서 접근하던 mapView가 사라지니 접근할 수가 없게 되었다.