2022. 5. 4. 14:29ㆍIT/안드로이드
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'
}
그리고 plugins 에 kotlin-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)에서 작성됩니다.
'IT > 안드로이드' 카테고리의 다른 글
Android - Back Stack (2) | 2022.05.11 |
---|---|
Android - Fragment 간 공유되는 ViewModel (6) | 2022.05.10 |
Android - App architecture (1) (2) | 2022.05.02 |
onSaveInstanceState() 가 동작을 안한다? (3) | 2022.04.28 |
Android - 데이터 손실시 onSaveInstanceState() 사용 (6) | 2022.04.27 |