๊ด์ฐฐ ๊ฐ๋ฅํ (Observable) ๋ฐ์ดํฐ ํ๋ ํด๋์ค๋ก, ๋ค๋ฅธ Observable ๋ฐ์ดํฐ์ ๋ฌ๋ฆฌ ์กํฐ๋นํฐ, ํ๋๊ทธ๋จผํธ ๋๋ ์๋น์ค์ ๊ฐ์ ๋ค๋ฅธ ์ฑ ์ปดํฌ๋ํธ์ ๋ผ์ดํ์ฌ์ดํด์ ๊ณ ๋ คํจ.
์ฆ, ํ์ฑ(active) ๋ผ์ดํ์ฌ์ดํด ์ํ์ ์๋ ์ฑ ์ปดํฌ๋ํธ ๊ด์ฐฐ์(Observer)๋ง ์ ๋ฐ์ดํธํ๋ค๋ ๊ฒ์ ๋ณด์ฅํจ.
LiveData๋ Observer ํด๋์ค๋ก ํํ๋๋ ์ต์ ๋ฒ๋ง ๊ณ ๋ คํ๋ฉฐ, ํด๋น ๋ผ์ดํ ์ฌ์ดํด์ด STARTED
๋๋ RESUMED
์ํ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ํ์ฑ ์ํ๋ก ๊ฐ์ฃผํ์ฌ ์
๋ฐ์ดํธ์ ๋ํ ์๋ฆผ์ ์ ๊ณตํจ.
LifecycleOwner
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด์ ๊ด๋ จ๋ ์ต์ ๋ฒ๋ฅผ ๋ฑ๋กํ ์ ์์.
ํด๋น ๋ผ์ดํ์ฌ์ดํด ๊ฐ์ฒด์ ์ํ๊ฐ DESTROYED
๋ก ๋ณ๊ฒฝ๋๋ฉด ์ต์ ๋ฒ๋ฅผ ์ ๊ฑฐํ ์ ์์.
-> ์กํฐ๋นํฐ, ํ๋๊ทธ๋จผํธ์ ์ ์ฉ. (๋ผ์ดํ์ฌ์ดํด์ด ์๋ฉธ๋๋ฉด ์ฆ์ ๊ตฌ๋
ํด์ง ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ)
1. UI๊ฐ ๋ฐ์ดํฐ ์ํ์ ์ผ์นํจ์ ๋ณด์ฅ.
LiveData๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ Observer ๊ฐ์ฒด์ ์๋ฆฌ๊ณ , ๋ฐ๋ผ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค UI๋ฅผ ์
๋ฐ์ดํธํ ํ์๊ฐ ์์.
2. ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง
์ต์ ๋ฒ๋ ๋ผ์ดํ์ฌ์ดํด ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ๋๋ฉฐ ์ฐ๊ฒฐ๋ ๋ผ์ดํ์ฌ์ดํด์ด ์๋ฉธ๋ ๋ ์ค์ค๋ก ์ ๋ฆฌํจ.
3. ์ค์ง๋ ์กํฐ๋นํฐ๋ก ์ธํ ์ถฉ๋์ด ์์.
์ต์ ๋ฒ์ ๋ผ์ดํ์ฌ์ดํด์ด ๋นํ์ฑ ์ํ์ธ ๊ฒฝ์ฐ (์: ๋ฐฑ์คํ์ ์๋ ์กํฐ๋นํฐ) LiveData ์ด๋ฒคํธ๋ฅผ ์์ ํ์ง ์์.
4. ์๋ ๋ผ์ดํ์ฌ์ดํด ์ฒ๋ฆฌ๊ฐ ํ์ ์์.
UI ๊ตฌ์ฑ ์์๋ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ง ๊ด์ฐฐํ๋ฉฐ ๊ด์ฐฐ์ ์ค์งํ๊ฑฐ๋ ์ฌ๊ฐํ์ง ์์. LiveData๋ ๊ด์ฐฐ ๋์ค์ ๊ด๋ จ ๋ผ์ดํ์ฌ์ดํด ์ํ ๋ณ๊ฒฝ์ ์๋์ผ๋ก ๊ด๋ฆฌํจ.
5. ํญ์ ์ต์ ๋ฐ์ดํฐ ์ฌ์ฉ.
๋ผ์ดํ์ฌ์ดํด์ด ๋นํ์ฑ์ธ ๊ฒฝ์ฐ ๋ค์ ํ์ฑ ์ํ๊ฐ ๋๋ฉด ์ต์ ๋ฐ์ดํฐ๋ฅผ ์์ ํจ.
(๋ฐฑ๊ทธ๋ผ์ด๋์ ์๋ ์กํฐ๋นํฐ๊ฐ ๋ค์ ํ๋ฉด์ผ๋ก ๋์์ค๋ฉด ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ๋ฐ์.)
6. ์ฌ๋ฐ๋ฅธ ๊ตฌ์ฑ ๋ณ๊ฒฝ
์กํฐ๋นํฐ๋ ํ๋๊ทธ๋จผํธ๊ฐ ๋๋ฐ์ด์ค ํ์ ๊ณผ ๊ฐ์ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ผ๋ก ๋ค์ ์์ฑ๋๋ฉด ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ต์ ๋ฐ์ดํฐ๋ฅผ ์์ ํจ.
7. ๋ฆฌ์์ค ๊ณต์
์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ์ฌ LiveData ๊ฐ์ฒด๋ฅผ ์์คํ
์๋น์ค์ ํ๋ฒ ์ฐ๊ฒฐํ๊ณ , ํด๋น ๋ฆฌ์์ค๊ฐ ํ์ํ ์ต์ ๋ฒ๋ LiveData๊ฐ์ฒด๋ฅผ ๊ฐ์ํ ์ ์์.
ํน์ ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ LiveData ์ธ์คํด์ค๋ฅผ ์์ฑ.
์ผ๋ฐ์ ์ผ๋ก ViewModel
ํด๋์ค ๋ด์์ ์ํ๋จ.
LiveData ๊ฐ์ฒด์ ๋ณด์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์์
์ ์ ์ดํ๋ onChanged()
๋ฉ์๋๋ฅผ ์ ์ํ๋ Observer ๊ฐ์ฒด๋ฅผ ์์ฑํจ. ์ผ๋ฐ์ ์ผ๋ก๋ ์กํฐ๋นํฐ ๋๋ ํ๋๊ทธ๋จผํธ์ ๊ฐ์ UI ์ปจํธ๋กค๋ฌ์์ ์์ฑํจ.
observe()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ Observer๊ฐ์ฒด๋ฅผ LiveData ๊ฐ์ฒด์ ๋ฑ๋ก.
observer()
๋ฉ์๋๋ LifecycleOwner ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํจ.
Observer ๊ฐ์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก ์กํฐ๋นํฐ๋ ํ๋๊ทธ๋จผํธ์ ๊ฐ์ UI ์ปจํธ๋กค๋ฌ์์ LiveData ๊ฐ์ฒด์ ๋ฑ๋กํจ.
LiveData๋ UI ์ปจํธ๋กค๋ฌ ์ต์ ๋ฒ๊ฐ ์
๋ฐ์ดํธ์ ๊ตฌ๋
ํ ์ ์๋๋ก ํ์ฉํจ.
LiveData ๊ฐ์ฒด๊ฐ ๋ณด์ ํ๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด UI๊ฐ ์๋์ผ๋ก ์๋ตํ์ฌ ์
๋ฐ์ดํธ๋จ.
๐ ์ฐธ๊ณ
observeForever(Observer)
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ๋ LifecycleOwner ๊ฐ์ฒด ์์ด ์ต์ ๋ฒ๋ฅผ ๋ฑ๋กํ ์ ์์
-> ์ด ๊ฒฝ์ฐ ์ต์ ๋ฒ๋ ํญ์ ํ์ฑ ์ํ๋ก ๊ฐ์ฃผ๋๋ฏ๋ก ํญ์ ์์ ์ฌํญ์ ๋ํด ์๋ฆผ์ ๋ฐ์.
์ด๋ฐ ์ต์ ๋ฒ๋ removeObserver(Observer)
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ ๊ฑฐํ ์ ์์.
LiveData๋ List์ ๊ฐ์ Collections๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ๋ฐ์ดํฐ์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ๋ํผ. LiveData ๊ฐ์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก ViewModel ๊ฐ์ฒด ๋ด์ ์ ์ฅ๋๋ฉฐ getter
๋ฉ์๋๋ฅผ ํตํด ์ก์ธ์ค๋จ.
LiveData ๊ฐ์ฒด ๋ด์ ์ด๊ธฐ ๋ฐ์ดํฐ๋ ์ค์ ๋์ง ์์.
class NameViewModel : ViewModel() {
// Create a LiveData with a String
val currentName: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
// Rest of the ViewModel...
}
UI ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ LiveData ๊ฐ์ฒด๋ฅผ ์กํฐ๋นํฐ๋ ํ๋๊ทธ๋จผํธ ๋์ ViewModel ๊ฐ์ฒด์ ์ ์ฅํด์ผํ๋ ์ด์
- ๋ณต์กํ ์ฝ๋์ ์กํฐ๋นํฐ์ ํ๋๊ทธ๋จผํธ๋ฅผ ํผํ๊ธฐ ์ํด. (To avoid bloated activiteds and fragments.) UI ์ปจํธ๋กค๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ์ญํ ์ ํ์ง๋ง ๋ฐ์ดํฐ ์ํ๋ฅผ ๋ณด์ ํ์ง ์์.
- LiveData ์ธ์คํด์ค๋ฅผ ํน์ ์กํฐ๋นํฐ๋ ํ๋๊ทธ๋จผํธ ์ธ์คํด์ค์ ๋ถ๋ฆฌ์ํค๊ณ LiveData ๊ฐ์ฒด๊ฐ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ ์ด์๋จ๋๋ก ํ๊ธฐ ์ํด.
onCreate()
๋ฉ์๋๊ฐ LiveData ๊ฐ์ฒด๋ฅผ ๊ด์ฐฐํ๊ธฐ์ ์ ์ ํ ์ด์
์์คํ
์ด ์กํฐ๋นํฐ๋ ํ๋๊ทธ๋จผํธ์ onResume()
์์ ์ค๋ณต ํธ์ถ์ ํ์ง ์๋ ๊ฒ์ ๋ณด์ฅํ๊ธฐ ์ํด.
์กํฐ๋นํฐ ๋๋ ํ๋๊ทธ๋จผํธ๊ฐ ํ์ฑ ์ํ๊ฐ ๋์๋ง์ ํ์ํ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธํ๋ ๊ฒ์ ๋ณด์ฅํ๊ธฐ ์ํด. ์ฑ ์ปดํฌ๋ํธ๊ฐ STARTED
์ํ๊ฐ ๋๋ฉด ๊ด์ฐฐ ์ค์ธ LiveData ๊ฐ์ฒด๋ก๋ถํฐ ๊ฐ์ฅ ์ต์ ๊ฐ์ ์์ ํจ.
LiveData๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ์ ๋ฐ์ดํธ๋ฅผ ์ ๋ฌํ๊ณ ํ์ฑํ๋ ์ต์ ๋ฒ์๊ฒ๋ง ์ ์ก.
class NameActivity : AppCompatActivity() {
// Use the 'by viewModels()' Kotlin property delegate
// from the activity-ktx artifact
private val model: NameViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Other code to setup the activity...
// Create the observer which updates the UI.
val nameObserver = Observer<String> { newName ->
// Update the UI, in this case, a TextView.
nameTextView.text = newName
}
// Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
model.currentName.observe(this, nameObserver)
}
}
LiveData๋ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ ์ํ public ๋ฉ์๋๊ฐ ์์.
MutableLiveData ํด๋์ค๋ setValue(T)
๋ฐ postValue(T)
๋ฉ์๋๋ฅผ ๊ณต๊ฐํ๋ฉฐ
LiveData ๊ฐ์ฒด์ ์ ์ฅ๋ ๊ฐ์ ์์ ํด์ผ ํ ๊ฒฝ์ฐ ์ด ๋ฉ์๋๋ค์ ์ฌ์ฉํด์ผ ํจ.
MutableLiveData๋ ViewModel์์ ์ฌ์ฉ๋๊ณ , ViewModel์ ์ต์ ๋ฒ์๊ฒ ๋ถ๋ณ์ LiveData ๊ฐ์ฒด๋ฅผ ๋ ธ์ถํจ.
button.setOnClickListener {
val anotherName = "John Doe"
model.currentName.setValue(anotherName)
}
Room ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ LiveData ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ observable ์ฟผ๋ฆฌ๋ฅผ ์ง์ํจ.
Observable ์ฟผ๋ฆฌ๋ DAO์ ์ผ๋ถ๋ก ์์ฑ๋จ.
Room์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ๋ฐ์ดํธ๋ ๋ LiveData ๊ฐ์ฒด๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด ํ์ํ ์ฝ๋๋ฅผ ์์ฑ.
์์ฑ๋ ์ฝ๋๋ ํ์ํ ๊ฒฝ์ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์ฟผ๋ฆฌ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ.
ViewModel์ ์ฃผ์ ์ญํ ์ UI ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ฏ๋ก LiveData ๊ฐ์ฒด๋ฅผ ๋ณด์ ํ๊ธฐ ์ข์. ViewModel์์ LiveData ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ UI ๋ ์ด์ด์ ๋ ธ์ถ์ํด.
์กํฐ๋นํฐ์ ํ๋๊ทธ๋จผํธ๋ LiveData ์ธ์คํด์ค๋ฅผ ๋ณด์ ํด์๋ ์๋จ.
-> UI ์ปจํธ๋กค๋ฌ์ ์ญํ ์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๊ฒ์ด ์๋ ์ํ๋ฅผ ๋ณด์ ํ๋ ๊ฒ.
-> ์กํฐ๋นํฐ์ ํ๋๊ทธ๋จผํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ์ง ์๋ ๊ฒ์ด ์ ๋ ํ
์คํธ๋ฅผ ์์ฑํ๊ธฐ ๋ ์ฌ์.
//๋ฉ์ธ ์ค๋ ๋๊ฐ ์ฐจ๋จ๋ ์ ์๋ ์ฝ๋
class UserRepository {
// DON'T DO THIS! LiveData objects should not live in the repository.
fun getUsers(): LiveData<List<User>> {
...
}
fun getNewPremiumUsers(): LiveData<List<User>> {
return getUsers().map { users ->
// This is an expensive call being made on the main thread and may
// cause noticeable jank in the UI!
users
.filter { user ->
user.isPremium
}
.filter { user ->
val lastSyncedTime = dao.getLastSyncedTime()
user.timeCreated > lastSyncedTime
}
}
}
์ฑ์ ๋ค๋ฅธ ๋ ์ด์ด์์ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฌ์ฉํด์ผํ ๊ฒฝ์ฐ Kotlin Flows๋ฅผ ์ฌ์ฉํ๊ณ ViewModel์์
asLiveData()
๋ฅผ ์ฌ์ฉํ์ฌ LiveData๋ก ๋ณํํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํจ.
Java๋ก ๋น๋๋ ์ฝ๋๋ฒ ์ด์ค๋ ์ฝ๋ฐฑ ํน์ RxJava์ ๊ฒฐํฉํ์ฌ Executors๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํจ.
//์ฃผ์ ๊ฐ๊ฒฉ ์
๋ฐ์ดํธ
class StockLiveData(symbol: String) : LiveData<BigDecimal>() {
private val stockManager = StockManager(symbol)
private val listener = { price: BigDecimal ->
value = price
}
override fun onActive() {
stockManager.requestPriceUpdates(listener)
}
override fun onInactive() {
stockManager.removeUpdates(listener)
}
}
onActive()
๋ฉ์๋๋ LiveData ๊ฐ์ฒด์ ํ์ฑ ์ต์ ๋ฒ๊ฐ ์์ ๊ฒฝ์ฐ ํธ์ถ๋จ.
์ด ๋ฉ์๋์์ ์ฃผ์ ๊ฐ๊ฒฉ ์
๋ฐ์ดํธ๋ฅผ ๊ด์ฐฐํ๊ธฐ ์์ํด์ผํจ.
onInactive()
๋ฉ์๋๋ LiveData ๊ฐ์ฒด์ ํ์ฑ ์ต์ ๋ฒ๊ฐ ์๋ ๊ฒฝ์ฐ ํธ์ถ๋จ.
ํ์ฑ ์ต์ ๋ฒ๊ฐ ์๊ธฐ ๋๋ฌธ์ StockManager ์๋น์ค์ ์ฐ๊ฒฐ์ ์ ์งํ ์ด์ ๊ฐ ์์.
setValue(T)
๋ฉ์๋๋ LiveData ์ธ์คํด์ค์ ๊ฐ์ ์
๋ฐ์ดํธํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ฑํ ๋ ์ต์ ๋ฒ์๊ฒ ์๋ฆผ.
//์ด๋ ๊ฒ๋ ์ฌ์ฉ ๊ฐ๋ฅ
public class MyFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val myPriceListener: LiveData<BigDecimal> = ...
myPriceListener.observe(viewLifecycleOwner, Observer<BigDecimal> { price: BigDecimal? ->
// Update the UI.
})
}
}
class StockLiveData(symbol: String) : LiveData<BigDecimal>() {
private val stockManager: StockManager = StockManager(symbol)
private val listener = { price: BigDecimal ->
value = price
}
override fun onActive() {
stockManager.requestPriceUpdates(listener)
}
override fun onInactive() {
stockManager.removeUpdates(listener)
}
companion object {
private lateinit var sInstance: StockLiveData
@MainThread
fun get(symbol: String): StockLiveData {
sInstance = if (::sInstance.isInitialized) sInstance else StockLiveData(symbol)
return sInstance
}
}
}
class MyFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
StockLiveData.get(symbol).observe(viewLifecycleOwner, Observer<BigDecimal> { price: BigDecimal? ->
// Update the UI.
})
}
์ฌ๋ฌ ํ๋๊ทธ๋จผํธ์ ์กํฐ๋นํฐ๊ฐ StockLiveData ์ธ์คํด์ค ๊ด์ฐฐ ๊ฐ๋ฅ. (ํ๋๊ทธ๋จผํธ๋ ์กํฐ๋นํฐ๊ฐ ๋ณด์ด๊ณ ์๊ณ -visible, ํ์ฑ์ธ ๊ฒฝ์ฐ์๋ง ์ฐ๊ฒฐ.)
LiveData ๊ฐ์ฒด์ ์ ์ฅ๋ ๊ฐ์ ์ต์ ๋ฒ์๊ฒ ์ ๋ฌํ๊ธฐ ์ ์ ํด๋น ๊ฐ์ ๋ณ๊ฒฝํ๊ฑฐ๋, ๋ค๋ฅธ LiveData ์ธ์คํด์ค๋ฅผ ๋ฐํํด์ผํ ์ ์์ผ๋ฏ๋ก Transformation ํด๋์ค๊ฐ ์ ๊ณต๋จ.
Transformations.map()
val userLiveData: LiveData<User> = UserLiveData()
val userName: LiveData<String> = userLiveData.map {
user -> "${user.name} ${user.lastName}"
}
Transformations.switchMap()
map()
๊ณผ ์ ์ฌํ๊ฒ LiveData ๊ฐ์ฒด์ ์ ์ฅ๋ ๊ฐ์ ํจ์๋ฅผ ์ ์ฉํ๊ณ ๊ฒฐ๊ณผ๋ฅผ downstream ์ผ๋ก ์ ํ.private fun getUser(id: String): LiveData<User> {
...
}
val userId: LiveData<String> = ...
val user = userId.switchMap { id -> getUser(id) }
+) 231209 ๋ด์ฉ ์ถ๊ฐ
LiveData<Y> switchMap (LiveData<X> trigger,
Function<X, LiveData<Y>> func)
trigger ๋ณ๊ฒฝ์ฌํญ์ด func์ ์ ์ฉ๋จ. func์ด null์ ๋ฐํํ๋ ๊ฒฝ์ฐ LiveData๋ backed๋์ง ์์.
func์ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋จ.
MutableLiveData userIdLiveData = ...;
LiveData userLiveData = Transformations.switchMap(userIdLiveData, id ->
repository.getUserById(id));
void setUserId(String userId) {
this.userIdLiveData.setValue(userId);
}
์ ์ฝ๋์์ repository๊ฐ User(1, "Jane"), User(2, "John") ์ด๋ผ๋ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํ์ ๋, userIdLiveData์ 1์ด ์ค์ ๋๋ฉด switchMap์ getUserById(1)์ ํธ์ถํ์ฌ LiveData๋ฅผ ๋ฐํํจ.
๋ฐ๋ผ์ userLiveData๋ User(1, "Jane")์ ๋ฐฉ์ถํจ.
userId=2๋ก setUserId ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด userIdLiveData๊ฐ์ด ๋ณ๊ฒฝ๋๊ณ ์ ์ฅ์์์ ID๊ฐ 2์ธ user๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ์์ฒญ์ด ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋จ.
userLiveData๋ User(2, "John")์ ๋ฐฉ์ถํจ.
repository.getUserById(1)์์ ๋ฐํ๋ LiveData๋ ์์ค์์ ์ ๊ฑฐ๋จ.
์์)
์ฃผ์๋ฅผ ์
๋ ฅ๋ฐ์ ํด๋น ์ฃผ์์ ์ฐํธ๋ฒํธ๋ฅผ ๋ฐํํ๋ UI ์์๊ฐ ์๋ ๊ฒฝ์ฐ
getPostalCode()
๋ฅผ ํธ์ถํ ๋๋ง๋ค ์ด์ LiveData ๊ฐ์ฒด์์ ๋ฑ๋ก ํด์ ํ๊ณ ์ ์ธ์คํด์ค์ ๋ฑ๋กํด์ผ ํจ.class MyViewModel(private val repository: PostalCodeRepository) : ViewModel() {
private fun getPostalCode(address: String): LiveData<String> {
// DON'T DO THIS
return repository.getPostCode(address)
}
}
class MyViewModel(private val repository: PostalCodeRepository) : ViewModel() {
private val addressInput = MutableLiveData<String>()
val postalCode: LiveData<String> = addressInput.switchMap {
address -> repository.getPostCode(address) }
private fun setInput(address: String) {
addressInput.value = address
}
}
์ฌ๋ฌ LiveData ์๋ณธ์ ๋ณํฉํ ์ ์๋๋ก ํด์ฃผ๋ LiveData์ ํ์ ํด๋์ค.
MediatorLiveData ๊ฐ์ฒด์ ๊ด์ฐฐ์๋ LiveData ์๋ณธ ๊ฐ์ฒด ์ค ํ๋๋ผ๋ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํธ๋ฆฌ๊ฑฐ๋จ.
์์)
UI์ ์๋ LiveData ๊ฐ์ฒด๊ฐ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ๋คํธ์ํฌ์์ ์
๋ฐ์ดํธ๋ ์ ์๋ ๊ฒฝ์ฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ๊ด๋ จ๋ LiveData ๊ฐ์ฒด.
๋คํธ์ํฌ์์ ์ก์ธ์ค๋ ๋ฐ์ดํฐ์ ๊ด๋ จ๋ LiveData ๊ฐ์ฒด.
๋ฅผ MediatorLiveData ๊ฐ์ฒด์ ์ถ๊ฐํ ์ ์์.