아래 글은 이전에 작성한 ViewModel 클래스를 참고하여 작성 되었습니다.
1. Livedata Implementation 하기
- App 모듈의 build.gradle에 아래 내용을 추가하고 sync 합니다..
dependencies {
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.2")
}
2. ViewModel 클래스에 Livedata 변수 만들고, 그 변수를 사용하는 함수 만들기
class FlashlightViewModel: ViewModel() {
private val _isFlashlightOn = MutableLiveData<Boolean>(false)
val isFlashlightOn: LiveData<Boolean> = _isFlashlightOn
fun turnOnFlashlight() {
_isFlashlightOn.postValue(true)
}
fun turnOffFlashlight() {
_isFlashlightOn.postValue(false)
}
}
3. Activity에서 ViewModel의 Livedata 변수 사용하기
class FlashlightActivity : AppCompatActivity() {
private val viewModel: FlashlightViewModel by lazy {
ViewModelProvider(this)[FlashlightViewModel::class.java]
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel.isFlashlightOn.observe(this) {
Log.d("FlashlightActivity", "isFlashlightOn : $it")
}
CoroutineScope(Dispatchers.Default).launch {
delay(1000)
viewModel.turnOnFlashlight()
delay(1000)
viewModel.turnOffFlashlight()
}
}
}
- Livedata 변수 선언 방법의 차이
private val _isFlashlightOn = MutableLiveData<Boolean>()
val isFlashlightOn: LiveData<Boolean>
get() = _isFlashlightOn
이 코드에서 *isFlashlightOn*은 읽기 전용(computed) 프로퍼티로 선언되었습니다. *_isFlashlightOn*은 실제 데이터를 저장하는 변수이고, isFlashlightOn 프로퍼티는 *_isFlashlightOn*의 값을 반환합니다. 이것은 보통 프로퍼티의 값을 변경하지 않고 다른 계산을 수행할 때 사용됩니다.
private val _isFlashlightOn = MutableLiveData<Boolean>()
val isFlashlightOn: LiveData<Boolean> = _isFlashlightOn
두 번째 코드에서는 isFlashlightOn 프로퍼티가 직접 *_isFlashlightOn*의 값을 가지고 있습니다. 이것은 isFlashlightOn 프로퍼티가 *_isFlashlightOn*과 동일한 값을 가지며, 변경될 때 *_isFlashlightOn*도 함께 변경된다는 의미입니다.
주요 차이점은 첫 번째 코드에서 *isFlashlightOn*이 읽기 전용(computed) 프로퍼티로 선언되었으므로 값을 얻을 때마다 *_isFlashlightOn*의 현재 값을 계산하는 것이고, 두 번째 코드에서 *isFlashlightOn*은 *_isFlashlightOn*과 동일한 값을 직접 가지고 있으므로 더 빠르게 값을 얻을 수 있습니다.
일반적으로 _isFlashlightOn 값의 변경이 필요하지 않고 해당 값을 직접 사용할 경우 두 번째 방법을 사용하는 것이 효율적입니다.
'Android > UI' 카테고리의 다른 글
[Android] Snackbar 사용하기 (0) | 2023.10.14 |
---|---|
[Android] DataBinding (0) | 2023.09.25 |
[Android] ViewBinding (0) | 2023.09.25 |
Android ViewModel 사용법 (0) | 2023.09.21 |
<include>로 다른 레이아웃을 포함시킬 때 뷰모델 전달 방법 (0) | 2023.08.29 |