๋ค๋ฅธ LiveData
๊ฐ์ฒด๋ฅผ observe
ํ๊ณ ํด๋น ๊ฐ์ฒด์ OnChanged
์ด๋ฒคํธ๋ฅผ ๋ฐ๋ LiveData
ํ์ ํด๋์ค์ด๋ค.
addSource()
๋ฉ์๋๋ฅผ ํตํด observe
ํ LiveData
์ ์ํํ ๋ก์ง์ ์ ๋ฌํ์ฌ ์ถ๊ฐํ๊ณ , removeSource()
๋ฉ์๋๋ฅผ ํตํด ์ ๊ฑฐํ๋ค.
MediatorLiveData
์ ํ์ฑ/๋นํ์ฑ ์ํ๋ฅผ onActive()
, onInactive()
๋ฉ์๋๋ฅผ ํตํด ์ถ๊ฐํ ํ์ LiveData
๊ฐ์ฒด์ ์ ๋ฌํ๋ค.
์ ๋ฆฌํด๋ณด๋ฉด MediatorLiveData
์ ํ๋ ๋๋ ์ฌ๋ฌ ๊ฐ์ LiveData
๋ฅผ ์ถ๊ฐํ์ฌ ์ถ๊ฐ๋ LiveData
์ onChanged
์ฝ๋ฐฑ์ ๋ฐ์ ์ฒ๋ฆฌํ ์ ์๋ค. ์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด์.
MediatorLiveData
๋ MutableLiveData
๋ฅผ ์์ํ๊ณ ์์ด ๊ฐ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. ๋ํ LiveData
์ Source
๋ฅผ ์ ์ฅํ Map
์ ๊ฐ์ง๊ณ ์๋ค.
Source
์๋ LiveData
์ onChanged
์ถ์ ๋ฉ์๋๊ฐ ํฌํจ๋ Observer
์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ Observer
๋ฅผ implements ํ๊ณ ์๋ค.
์ ๋ฌ๋ฐ์ LiveData
์ onChanged()
์ฝ๋ฐฑ ๋ฑ๋ก์ ์ํ plug()
, unplug()
๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๊ณ onChanged()
์ฝ๋ฐฑ์ ๋ฐ์ผ๋ฉด mObserver.onChanged(v);
๋ฅผ ํธ์ถํ๋ค.
์ฌ๊ธฐ์ Source
๋ LiveData
๋ฅผ ์ต์ ธ๋นํ๋ฉฐ ๋ณํ๋ฅผ ๊ฐ์งํ์ ๋ ์ ๋ฌ๋ฐ์ Observer
์ onChanged
๋ฅผ ํธ์ถํ๋ค๋ ๊ฒ์ ์ ์ ์์๋ค.
Source
๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ์ LiveData
์ Observer
๋ฅผ ์ด์ฉํด ์์ฑํด ์ฃผ๊ณ mSources
์ ์ ์ฅํ ๋ค MediatorLiveData
๊ฐ ์กํฐ๋ธ ์ํ์ผ ๊ฒฝ์ฐ ์์ฑํ Source
๋ฅผ plug()
์ํ๋ก ๋ณ๊ฒฝํด ์ค๋ค.
์ ๋ฌ๋ฐ์ LiveData
๋ฅผ mSources
์์ ์ ๊ฑฐํ๊ณ ํด๋น Source
๊ฐ null์ด ์๋ ๊ฒฝ์ฐ unplug()
์ํ๋ก ๋ณ๊ฒฝํ๋ค.
Activity
๋ฐ Fragment
์ Lifecycle
์ํ์ ๋ฐ๋ผ onActive()
, onInactive()
๊ฐ ํธ์ถ๋๋ฉฐ, mSources
์ ์๋ ๋ชจ๋ Source
๋ฅผ plug()
, unplug()
์ํ๋ก ๋ณ๊ฒฝํ๋ค.
EditText
์ ์
๋ ฅ๊ฐ์ ๋ฐ๋ Two-way-binding
์ ์ฌ์ฉํ MutableLiveData
๋ ๊ฐ์ง๊ฐ ์๊ณ MediatorLiveData
ํ๋์ ๊ทธ Backing field์ธ LiveData
๊ฐ ํ๋ ์๋ค.
init
๋ธ๋ก์ ์ดํด๋ณด๋ฉด addSource
๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ ๊ฐ์ง MutableLiveData
์ ์ฝ๋ฐฑ ์ ์ํํ ์ฝ๋๋ฅผ ์ค์ ํ๋ค.
userId
, userPassword
๊ฐ ๋ณ๊ฒฝ๋ ๋ checkProcess()
๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉฐ _isProcessComplete
์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ค.
LiveData
๋ฅผ ๋ณํํ๊ณ ์ ํ ๋ ์ฌ์ฉ๋๋ค.
Transformations
์ ํฌํจ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ observer
์ lifecycle
์ ๊ฑธ์ณ ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์๋ค.
Observer
๊ฐ ๋ฐํ๋ LiveData
๊ฐ์ฒด๋ฅผ ์ต์ ๋นํ์ง ์๋ ํ ๊ณ์ฐ๋์ง ์๋๋ค. ๊ทธ ์ด์ ๋ Transformations
์ด lazy ํ๊ฒ ๊ณ์ฐ๋๊ธฐ ๋๋ฌธ์ ๋ช
์์ ํธ์ถ์ด๋ ์ข
์์ฑ์ ์๊ตฌํ์ง ์๊ณ lifecycle
๊ด๋ จ ๋์์ด ์์์ ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.
์์ ์์๋ณธ MediatorLiveData
๋ฅผ ํ์ฉํ๊ณ ์๋ค.
์๋ก์ด MediatorLiveData
๊ฐ์ฒด๋ฅผ ์์ฑํด ์ ๋ฌ๋ฐ์ LiveData
์ mapFunction
์ ๋ํด์ฃผ๋ฉฐ ๋ฐํํ๋ค. onChanged()
์์ mapFunction
์ ๊ฒฐ๊ณผ๋ฅผ MediatorLiveData
๊ฐ์ฒด์ set
ํ๋ค. ์ ๋ฌ๋ฐ์ LiveData
์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ฐํ๋ MediatorLiveData
๊ฐ์ฒด์ set
์์
์ด ์ํ๋ ๊ฒ์ด๋ค.
mapFunction
์ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋๋ค.
userLiveData
๋ฅผ ์ต์ ธ๋น ํ๊ณ ์์ผ๋ฉฐ ๊ฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋ฌ์ ๋ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ์ค์ ํด ์ค๋ค.
onChanged()
๋ฅผ ์ดํด๋ณด๋ฉด ํจ์์ ๊ฒฐ๊ณผ๋ก ๋ฐ์ LiveData
์ mSource
๋ฅผ ๋น๊ตํ์ฌ ๋์ผํ๋ฉด ์๋ฌด ์์
๋ ์ํํ์ง ์๋๋ค. ๋ค๋ฅผ ๊ฒฝ์ฐ ๊ธฐ์กด Source
๋ ์ ๊ฑฐํ๋ฉฐ ๊ฒฐ๊ณผ๋ก ๋ฐ์ LiveData
๋ฅผ map()
๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ถ๊ฐํด ์ค๋ค.
switchMapFunction
์ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋๋ค.
setUserId()
๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ repository.getUserById(it)
ํจ์๊ฐ ํธ์ถ๋๋ฉฐ ๊ธฐ์กด LiveData
์ ๋์ผํ์ง ๋น๊ตํ๋ค. ๋ค๋ฅผ ๊ฒฝ์ฐ ํด๋น ๊ฒฐ๊ณผ๊ฐ ์ ์ฉ๋๋ค.