본문 바로가기
Android/UI

[Android] Livedata 사용하기

by startSW 2023. 9. 21.

아래 글은 이전에 작성한 ViewModel 클래스를 참고하여 작성 되었습니다.

https://swjsw.tistory.com/19

 

Android ViewModel 사용법

1. ViewModel Implementation 하기 App 모듈의 build.gradle에 아래 내용을 추가하고 sync 합니다.. dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2") } 2. ViewModel 클래스 만들기 import androidx.lifecycle.V

swjsw.tistory.com

 

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