Android - ViewModel 과 LiveData 사용하기

2022. 5. 4. 14:29IT/안드로이드

반응형

LiveData는, 수명 주기를 인식하는 관찰 가능한 데이터 홀더 클래스이다.  (?!?!?! ㅠㅠ)

LiveData는, 

  • LiveData는 Data를 보유한다. LiveData는 모든 유형의 데이터에서 사용할 수 있는 래퍼이다.
  • LiveData는 관찰이 가능하다. 즉, LiveData 객체에서 보유한 데이터가 변경되면, 관찰자에 알림이 제공된다.
  • LiveData는 수명 주기를 인식한다. Livedata에 관찰자를 연결하면 관찰자는, LifeCycleOwner ( Activity 또는 Fragment) 와 연결된다. LiveData 는 STARTED 또는 RESUMED 같은 활성 수명 주기 상태인 관찰자만 업데이트한다.

MutableLiveData 는, 변경 가능한 버전의 LiveData 이다. 즉, 내부에 저장된 데이터의 값을 변경할 수 있다.


이전 작업들은 App이 코드의 데이터 변경 사항을 수신했었다. ! 마찬가지로, App은 layout 에서 Data 변경사항을 수신할  수 있다. Databinding 을 사용하면 관찰 가능한 LiveData 값이 변경될 때, binding된 layout 의 UI 요소에도 알림이 전송되며, 레이아웃 내에서 UI를 업뎃 할 수 있다. 

이전 Codelab에서는 단방향 결합인 view 결합을 확인했다.

viewBinding은, view -> Code 에 바인딩 했지만, Code -> view 에 바인딩 할 수는 없다. 

 ** viewBinding 에 관한 복습 : 
viewBinding은, 코드에서 view 에 더 쉽게 접근 할 수 있는 기능이다.
각 XML layout 파일의 결합 클래스를 생성한다. 
결합 클래스의 인스턴스에는 상응하는 레이아웃 ID가 있는 모든 뷰의 직접 참조가 포함된다. 
근데, viewBinding을 사용하면, view(layout file, *.xml) 에서 App 데이터를 참조할 수 없다. 
이런 작업은 DataBinding을 사용하면 된다. 

 

# 데이터 결합 (dataBinding)

dataBinding 라이브러리는 Jetpack 의 일부이다. dataBinding은 , 선언적 형식을 사용해 layout의 UI 구성요소를 App의 데이터 소스에 바인딩 한다. 

간단히 말해서, dataBinding은 코드에서 데이터를 뷰 + 뷰 결합에 결합(View를 Code에 결합) 하는것이다. 

# UI 컨트롤러에서 뷰 결합 사용의 예 #

binding.textViewUnscrambledWord.text = viewModel.currentScrambledWord

# 레이아웃 파일에서 데이터 결합 사용의 예 #

android:text="@{gameViewModel.currentScrambledWord}"

 

dataBinding의 주요 이점은, 많은 UI 프레임워크 호출을 삭제할 수 있어 파일이 단순해지고 손쉬운 유지관리가 가능하다는 점이다. 또한 mem leak , null 포인터 예외를 방지할수있음.

dataBinding을 사용하려면 아래 순서와 같다. 

1. viewBinding 을 dataBinding으로 변경한다.

buildFeatures {
   viewBinding = true
}

에서

buildFeatures {
   dataBinding = true
}

으로 바꾼다.

plugins {
   id 'com.android.application'
   id 'kotlin-android'
   id 'kotlin-kapt'
}

그리고 pluginskotlin-kapt 를 적용한다. 

 

2. 

레이아웃 xml 파일의 루트 요소를 layout 태그로 묶는다. 또한 namespace 정의(xmlns:로 시작하는 속성) 을 새 루트요소인 <layout xmlns:....> 로 이동해야한다. 

<layout> 태그 안에 <data></data> 태그를 추가한다. 아래와 같은 방식으로... !

<layout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools">

   <data>

   </data>

   <ScrollView
       android:layout_width="match_parent"
       android:layout_height="match_parent">

       <androidx.constraintlayout.widget.ConstraintLayout
         ...
       </androidx.constraintlayout.widget.ConstraintLayout>
   </ScrollView>
</layout>

 

3. 

onCreateView() 의 binding 변수의 인스턴스를 변경한다. 

binding = GameFragmentBinding.inflate(inflater, container, false)

이걸 아래와 같이 변경한다.

binding = DataBindingUtil.inflate(inflater, R.layout.game_fragment, container, false)

이러면 이제 App이 dataBinding을 사용하고, 레이아웃의 뷰가 앱 데이터에 액세스 할수 있게 된다. 

 

## 요약 ##

  • LiveData는 데이터를 보유합니다. LiveData는 모든 데이터에 사용할 수 있는 래퍼입니다.
  • LiveData는 관찰 가능합니다. 즉, LiveData 객체에서 보유한 데이터가 변경되면 관찰자에 알림이 제공됩니다.
  • LiveData는 수명 주기를 인식합니다. LiveData에 관찰자를 연결하면 관찰자는 LifecycleOwner(일반적으로 활동 또는 프래그먼트)와 연결됩니다. LiveData는 STARTED 또는 RESUMED 같은 활성 수명 주기 상태인 관찰자만 업데이트합니다.
  • 앱은 데이터 결합 및 결합 표현식을 사용하여 레이아웃에서 LiveData 변경사항을 수신할 수 있습니다.
  • 결합 표현식은 레이아웃 내에서 레이아웃 속성을 참조하는 속성(attribute properties)(예: android:text)에서 작성됩니다.

 

 

 

 

728x90
반응형