Android

[Android] μ•ˆλ“œλ‘œμ΄λ“œ LiveData λ°”λ‘œ μˆ˜μ • λ˜μ§€ μ•ŠλŠ” 이유 및 ν•΄κ²°λ°©μ•ˆ - setValue() 와 postValue()의 차이점

λŽμš” 2022. 12. 2. 11:23

μ•ˆλ…•ν•˜μ„Έμš” πŸ‘‹

μ˜€λŠ˜μ€ 개발 쀑에 마주친 μž‘μ€ 이슈λ₯Ό μˆ˜μ •ν•˜λ‹€κ°€

μ•Œκ²Œ 된 사싀에 λŒ€ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ ν¬μŠ€νŒ…ν•΄λ³΄λ € ν•©λ‹ˆλ‹€.

 

 

μ €λŠ” ViewModel을 μ‚¬μš©μ‹œμ— LiveData의 값을 λ³€κ²½ν•˜κ²Œ 되면

postValue() ν•¨μˆ˜λ₯Ό 주둜 μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 

 

그런데

ViewModel의 값을 λ³€κ²½ 후에 λ°”λ‘œ 값을 읽으렀 ν•  경우

λ³€κ²½λœ 값을 읽지 λͺ»ν•˜κ³ μ΄μ „ 값을 읽어 λ™μž‘μ΄ 잘λͺ»λ˜λŠ” κ²½μš°κ°€ λ”λŸ¬ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. πŸ€”

 

μ•Œμ•„λ³΄λ‹ˆ 해결방법은 μ•„μ£Ό κ°„λ‹¨ν–ˆμŠ΅λ‹ˆλ‹€.

 

λ°”λ‘œ 값을 λ³€κ²½ν•˜μ—¬ 읽어야 ν•˜λŠ” κ²½μš°μ—λŠ” postValue()λ₯Ό ν†΅ν•œ 변경이 μ•„λ‹Œ

setValue()λ₯Ό 톡해 값을 λ³€κ²½ν•˜μ—¬ 읽으면 λ©λ‹ˆλ‹€. 🀩

 

μ΄λ ‡κ²Œ λ˜λŠ” 것이 λ‹Ήμ—°ν•œλ° ν•΄λ‹Ή 뢀뢄에 λŒ€ν•΄μ„œλŠ” μ•„λž˜ μ„€λͺ…을 μ°Έκ³  λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.


setValue()와 postValue()의 차이

λ¨Όμ € 두 ν•¨μˆ˜ λͺ¨λ‘ LiveData의 값을 λ³€κ²½μ‹œν‚€λŠ” ν•¨μˆ˜μ΄μ§€λ§Œ 

큰 차이점이 μžˆμŠ΅λ‹ˆλ‹€.

 

λ°”λ‘œ ν•΄λ‹Ή LiveDataλ₯Ό κ΅¬λ…ν•˜κ³  μžˆλŠ” observerκ°€ 값을 읽을 λ•Œ

'λ°”λ‘œ' λ³€κ²½μ‹œν‚€λŠλƒ μ•„λ‹ˆλƒμž…λ‹ˆλ‹€.

 

말μž₯λ‚œ κ°™μ§€λ§Œ λ‚΄λΆ€μ μœΌλ‘œ 확인해보면 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

setValue()의 경우 값을 λ³€κ²½ μ‹œμ— main threadμ—μ„œ λ°”λ‘œ λ³€κ²½ν•˜μ§€λ§Œ

 

postValue()λŠ” λ‚΄λΆ€μ μœΌλ‘œ new Handler(Looper.mainLooper()). post(() -> setValue())둜 λ™μž‘ν•©λ‹ˆλ‹€.

즉, handlerλ₯Ό 톡해 main looperμ—μ„œ setting ν•˜μ—¬ 값이 λ³€κ²½λ˜λŠ” λ™μž‘μ΄κΈ° λ•Œλ¬Έμ—

λ³€κ²½ μ¦‰μ‹œ 값을 읽으렀고 ν•  경우 이전 값을 읽게 λ˜λŠ” κ²½μš°κ°€ μƒκΈ°λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

μ•„μšΈλŸ¬, 곡식 λ¬Έμ„œλ₯Ό 확인 μ‹œμ—λ„ μ•„λž˜μ™€ 같이 μ½”λ©˜νŠΈκ°€ μ ν˜€μžˆκΈ°μ—

λ°”λ‘œ λ³€κ²½λœ LiveData의 값을 읽고 싢을 κ²½μš°μ—λŠ” setValue()λ₯Ό μ‚¬μš©ν•˜λ©΄ 될 것 κ°™μŠ΅λ‹ˆλ‹€.

(단, setValue()λŠ” λ°˜λ“œμ‹œ main threadμ—μ„œ ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.)

 

 

 

μ•„λž˜λŠ” MutabeLiveData의 κ³΅μ‹λ¬Έμ„œμž…λ‹ˆλ‹€. μ°Έκ³  λΆ€νƒλ“œλ¦½λ‹ˆλ‹€. 😎

 

 

MutableLiveData  |  Android Developers

Stay organized with collections Save and categorize content based on your preferences. added in version 1.0.0 belongs to Maven artifact android.arch.lifecycle:livedata-core:1.1.1 MutableLiveData The android.arch Architecture Components packages are no long

developer.android.com

 

μ˜€λŠ˜λ„ μ¦μ½”ν•˜μ„Έμš” :)