[안드로이드 공부]/코틀린

[MVVM] LiveData와 ViewModel Observer로 연결

코코모아 2020. 8. 7. 17:01

아래는 코모스튜디오가 직접 만든 무료 앱이에요
(한 번만 봐주세요 ^^)

01

02

03

정각알림 만들기(말하는시계)

말하는 시계 (취침, 자전거) 

말하는 타이머 음성 스톱워치 

Repository의 Data가 변경 되었을 때 UI에 알리기 위해서는 ViewModel이 관찰을 하고 있어야 한다.

 

UI(V)는 보통 onCreate()에서 VM을 생성하고, VM은 Repository를 생성한 뒤 M과 Dao를 통해 연결 되는데, 이 Dao를 LiveData로 구성하면 ViewModel이 지켜 볼 수(obsever) 있게 된다.

 

연결(MVVM)

onCreate/onCreateView 실행이 되면서 viewModel 생성 작업과 이후 연결 작업이 실행 된다.

Fragment.kt
private val plantDetailViewModel: PlantDetailViewModel by viewModels {
   InjectorUtils.providePlantDetailViewModelFactory(requireActivity(), args.plantId)
}
ViewModel.kt
 
val plant = plantRepository.getPlant(plantId)
Repository.kt 

fun getPlant(plantId: String) = plantDao.getPlant(plantId)
Dao.kt
 
@Query("SELECT * FROM plants WHERE id = :plantId")
fun getPlant(plantId: String): LiveData<Plant>

관찰(Observe)

onCreate/onCreateView에서 아래와 같이 Observer를 등록해서 이후 작업을 처리 한다.

val plantObserver = Observer<Plant> {
   //데이터 변경 시, 해야할 View 작업들
}

//옵져버 등록
plantDetailViewModel.plant.observe(viewLifecycleOwner, plantObserver)

위 부분을 코틀린이 아닌 자바로 할 경우에는

final Observer<Plant> plantObserver = new Observer<Plant>(){
   @Override
   public void onChanged(@Nullable final Plant plant){
      //UI 작업
   }
}

viewModel.plant.observe(this, plantObserver)

 

만약, 위와 같이 Observer를 등록하지 않고, onCreate에서 view에 viewModel.plant.value? 작업으로 get을 하려고 하면 null 값이 발생한다.

 

왜냐하면, View는  ViewModel을 생성하고, 레파지토리를 생성하고 Dao, LiveData 를 생성해서 Data를  LiveDatad에 set 하는 작업을 백그라운드에서 작업을 하고 있는데, 실제 UI의 LifeCycle은 변경되어 onCreate가 끝나 버렸기 때문이다. 즉, LifeCycle이 변경되더라도 Data의 변경 사항이 발생하면 UI에 알려서 직접 UI를 변경 할 수 있는 연결 고리를 만드는 것이다.

모든 게시물은 코모스튜디오의 소유이며, 무단 복제 수정은 절대 불가입니다.
퍼가실 경우 댓글과 블로그 주소를 남기고 해당 게시물에 출처를 명확히 밝히세요.