LiveData 생성하기

2021. 10. 26. 17:32Kotlin/Android

# LiveData 초기화하기

LiveData 초기화하는 방법은 2가지가 있다.

하지만 LiveData는 비동기 데이터 스트림을 처리하도록 설계되지 않았다. 즉 데이터 스트림을 결합하는 기능이 매우 제한적이다.

- LiveData로 변환

- MediatorLiveData를 사용

 

추천하는 방식은 

Kotlin Flow를 사용한 후, asLiveData() 메서드를 통해 LiveData로 변환하는 방식이다.

Java로 빌드된 코드인 경우, CallBack이나 RxJava와 함께 Executor를 사용하는 것을 추천한다.

 

# ViewModel에서 LiveData 사용하는 방법

LiveData는 List와 같은 데이터의 wrapper에 해당한다.

일반적으로 ViewModel에서는 다음과 같은 형태로 사용한다.

class NameViewModel : ViewModel() {

    // LiveData 생성하기
    val currentName: MutableLiveData<String> by lazy {
        MutableLiveData<String>() // load 데이터
    }
}

 

# LiveData와 Observer 연결하기

앱 컴포넌트의 onCreate() 메서드가 observe()를 선언하기에 가장 적합하다. 그 이유는 다음과 같다.

- System이 Activity나 Fragment의 onResume() 메서드를 중복 호출하지 않도록 하기 위해서.

- Activity나 Fragment가 Active한 상태(STARTED)가 되는 즉시, 데이터의 최신 값을 포함하기 위해서.

단, 이는 LiveData가 설정된 경우에 가능하다.

class NameActivity : AppCompatActivity() {

    // Use the 'by viewModels()' Kotlin property delegate
    // from the activity-ktx artifact
    // = 'by viewModels()'를 사용하려면 activity-ktx를 포함시키세요.
    private val model: NameViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // this activity setup ...

        // Observer 생성하기
        val nameObserver = Observer<String> { newName ->
            // UI 업데이트 작업 ...
            nameTextView.text = newName
        }

        // LiveData를 Observe하기
        // LifecycleOwner로서 this Activity와, 위의 Observer 이용
        model.currentName.observe(this, nameObserver)
    }
}

 

# LiveData 업데이트하기

LiveData는 저장된 data를 업데이트하는데 제공되는 메서드가 없다.

MutableLiveData는 setValue(T)나 postValue(T)를 제공한다.

 

기본 thread에서 LiveData를 업데이트하는 경우에는, setValue(T)

worker thread에서 업데이트하는 경우에는, postValue(T)를 사용하면 된다.

button.setOnClickListener {
    val anotherName = "John Doe"
    // setValue()로 LiveData 업데이트하기
    model.currentName.setValue(anotherName)
}
반응형

'Kotlin > Android' 카테고리의 다른 글

OkHttp 와 Retrofit 차이  (0) 2021.11.06
Android Studio에서 SHA-1키 얻는 방법  (0) 2021.10.31
MediatorLiveData로 LiveData 병합하기  (0) 2021.10.27
LiveData 변환하기  (0) 2021.10.27
LiveData 란?  (0) 2021.10.26