일일 회고
금요일이다. 뭔가 많이 했나? 한거 같긴하다. 개인 과제 기능구현은 거의? 다 한 것 같다. 이제 버그를 찾으면서 수정해보자....
주말에는 선발대 과제를 해보면서 조금 쉬는 시간을 갖자....
오늘의 키워드
- Activity - LifecycleOwner, Fragment - viewLifecycleOwner
- Sealed Class
- Repository pattern
Activity - LifecycleOwner Fragment - viewLifecycleOwner
개발을 하다보면 Activity와 Fragment를 함께 사용하면서 복잡한 생명주기를 다루게 되는 순간이 있다,
이럴 때에, 생명주기에 더욱 주의를 기울여야 하는데, AAC의 Lifecycle이 생명주기의 처리를 도와준다.
LiveData
- 관찰 가능한 데이터 홀더 클래스
- Observer 패턴으로 쉽고 간단하게 구현 할 수 있다.
- livedata는 lifecycle aware component로서, observer의 생명주기를 인식해서 따라간다.
- 생명 주기 인식을 통해 LiveData는 활동 수명 주기 상태에 있는 앱 구성요소 관찰자만 업데이트 한다
Lifecycle
- Lifecycle : Lifecycle을 나타내는 객체이다
- LifecycleOwner : Activity나 Fragment의 Lifecycle을 분리하여 담은 객체를 말하며,
Lifecycle 객체에 액티비티, 프래그먼 상태를 제공해준다.
액티비티의 AppCompatActivity는 내부적으로 LifecycleOwner를 구현하고 있다.
Activity는 lifecycle 객체를 직접 참조할 수 있다. - LifecycleObserver : Lifecycle로 부터 액티비티 상태변화에 대한 이벤트를 받습니다.
// activity
viewModel.state.observe(this) {
// 상태에 따른 행위 동작
}
Activity에서는 this키워드를 통해 activity lifecycle을 가져와 생명주기를 인식시켜 viewModel의 데이터 변화를 관할하면 된다. LifecycleOwner를 통해 view의 생명주기를 관찰하고 그 뷰와 생명주기를 같이하게 된다.
이제 프래그먼트를 봐보자
// fragment
viewModel.state.observe(this) {
// 상태에 따른 행위 동작
}
프래그먼트에서는 위의 액티비티 처럼 LifecycleOwner에 this를 전달하여 사용을 하지 말아야한다.
문법적인 오류없이 빌드는 되지만 화면을 돌리게 되면 앱이 죽게 된다..
그 이유는 프래그먼트는 액티비티와 다르게 onDestroy()가 호출되지 않은 상태에서 onCreateView()가 여러 번 호출 될 수 있기 때문이다
즉 프래그먼트의 Lifecycle은 onDestroy()를 거치지 않은 상황(아직 살아있는 상황)에서 새로운 Observer가 등록되어, 여러개의 Observer가 호출되는 현상이 발생할 수 있다.
자세히 살펴보면 프래그먼트는 2개의 lifecycle이 존재한다.
프래그먼트의 this - 프래그먼트 자체 생명주기(lifecycleOwner)와 와 프래그먼트 뷰의 생명주기 (viewLifecycleOwner)가 있다.
자체 생명주기는 onAttach~onDestroy까지 전반적인 생명주기를 갖고 있고, 뷰의 생명주기는 onCreateView부터 onDestroyView까지 UI의 활성여부까지의 생명주기를 갖고있다.
자체 생명주기가 뷰의 생명주기보다 약간 더 길다.
그래서 프래그먼트의 옵저버에 자체생명주기(this)를 준채로, 화면 회전이나 화면 이동 후 돌아오는 상황이 발생하면, 현재화면은 onDestroyView()가 호출되어 화면은 소멸되지만, onDestroy()를 거치지 않아 프래그먼트 자체 생명주기가 사라지지 않은 채로 남아있어, 돌아왔을 때, onCreateView()가 불리고 여기서 새로운 옵저버가 호출되어 중복되는 현상이 나타난다.
프래그먼트 UI업데이트 시에는 옵저버의 중복 호출을 막기 위해, this가 아닌 viewLifecycleOwner를 사용하여 프래그먼트 뷰 생명주기를 사용한다.
Sealed Class (& enum class)
Repository Pattern
공부 및 적용해보는 중....
ref.
'내일배움캠프 7기 > TIL' 카테고리의 다른 글
내일배움캠프 7기 Android TIL 47일차 (2023.09.19) (1) | 2023.09.19 |
---|---|
내일배움캠프 7기 Android TIL 46일차 (2023.09.18) (0) | 2023.09.18 |
내일배움캠프 7기 Android TIL 44일차 (2023.09.14) (0) | 2023.09.14 |
내일배움캠프 7기 Android TIL 43일차 (2023.09.13) (0) | 2023.09.13 |
내일배움캠프 7기 Android TIL 42일차 (2023.09.12) (0) | 2023.09.12 |