이번 포스팅에서는 제가 개인 프로젝트를 진행하면서 livedata를 활용하여 observe를 통해 roomdb를 갱신하던 중 observe가 중첩되어 클릭할때마다 횟수가 누적되어 여러번 진행되던 상황을 포스팅하겠습니다.
이번 문제가 된 부분은 fragment에서 roomdb로 접근 및 data를 수정하여 다시 출력하는 부분이였습니다.
먼저 문제가 되었던 부분입니다. getSearchResults()가 livedata를 리턴하는 함수이고 이에 observe를 주어 timetable의 변화를 확인하고 수정하도록 하는 코드입니다.
viewModel.getSearchResults().observe(viewLifecycleOwner){ timetable ->
timetable?.let {
deleteTimeSheet(it[0],id,position)
Log.e(TAG,"$id 탐색1 날짜: ${it[0].date}")
}
}
아래 캡쳐본과 같이 탐색1 날짜짜가 2번, 3번씩 나오게 되어 내부에서 roomdb를 조작할시 2번 3번 연속 삭제를 하게되어 null 이 발생되어 앱이 동작을 멈추는 문제가 발생하였습니다.
이에 최초 해당 livedata를 관찰하는 observe 여부를 확인하였으나 다른 activity였고 생명주기가 겹치지 않고 그 두 observe는 문제가 없었습니다.
그래서 생명주기부터 다시 살펴본 결과 해당 fragment가 죽지 않고 클릭시 observe가 생성만 되고 죽지 않는 것을 알았습니다. 그래서 roomdb를 건들고 observer를 생성하여 수정했을때 아래 코드를 추가하여 fragment를 갱신시키도록 수정하였습니다.
val ft = activity?.supportFragmentManager?.beginTransaction()
ft!!.replace(R.id.tabContent,TimeTableFragment()).commit()
이 결과 삭제 후 fragment를 다시 생성하여 observer도 제거 후 버튼 클릭시 1개만 생성되어 중첩 문제를 해결하였습니다.
viewModel.getSearchResults().observe(viewLifecycleOwner){ timetable ->
timetable?.let {
deleteTimeSheet(it[0],id,position)
Log.e(TAG,"$id 탐색1 날짜: ${it[0].date}")
val ft = activity?.supportFragmentManager?.beginTransaction()
ft!!.replace(R.id.tabContent,TimeTableFragment()).commit()
}
}
앞으로 mvvm을 주로 사용하기에 livedata로 viewModel의 data를 관찰할 observer 생성시 중첩 문제가 없도록 다시 한번 신경써야겠고 이러한 문제 발생시 어디를 위주로 봐야할지 알아내었습니다.
1. livedata 의 observer은 1개만 있어야한다.
2. observe(viewLifecyclerOwner) 의 viewLifecyclerOwner 생명주기는 fragment보단 짧지만 코드 설계에 따라 죽지않고 중첩될수 있으므로 이때 fragment를 갱신하는 것을 고려한다.
다음 포스팅으로 이번 문제 덕분에 생명주기의 중요성을 다시 알았기때문에 생명주기 관련하여 다시 공부할 목적으로 생명주기를 포스팅하겠습니다.
'안드로이드 > androidstudio' 카테고리의 다른 글
[Android] device 디스플레이 환경설정 크기 변경에 영향 안받기 (0) | 2023.03.05 |
---|---|
[Android] Kakao Map Marker event(drag, click) (0) | 2022.12.09 |
[Android] retrofit 통해 data 가져오기 (0) | 2022.12.06 |
[Android] TimePicker, DatePicker (0) | 2022.12.05 |
[Android] Spinner 사용법 (0) | 2022.12.04 |