LiveData< > vs Observable< > vs Channel< > Observable Observer Emit 👁 👁 Observable/Publisher/Emitter/Subject/Channel/Flowable Observer/Subscriber/Disposable/Receiver/Consumer/Collector Emit/Publish/ Send/Broadcast 3 Observables • LiveData<T> • io.reactivex.Observable<T> • kotlinx.coroutines.channels .Channel<T> Flow<T> Flowable<T> equivalenty related LiveData< > LiveData< > • Built into Android AppCompat Library • Is meant to provide up-to-date data to UI • Tied to Activity/Fragment lifecycle to prevent leaks/crashes • Reliable, easy, simple • Good for beginners LiveData< > • Built into Android AppCompat Library • Is meant to provide up-to-date data to UI • Tied to Activity/Fragment lifecycle to prevent leaks/crashes • Reliable, easy, simple • Good for beginners Activity/ Fragment (onCreate) Hardcoded URL The Worst Way get Email email@ address.com Slightly Be tt er Activity/ Fragment (onCreate) API Service ViewModel Repository (Database) get Email oldEmail@ address.com get Email newEmail@ address.com newEmail@ address.com LiveData<> Activity/ Fragment (onCreate) 👁 API Service Repository (Database) LiveData oldEmail@ address.com newEmail@ address.com ViewModel update Email LiveData<> Observer 👁 class UserFragment/Activity { override fun onCreate(savedInstanceState: Bundle?) { } } LiveData<> Observer 👁 class UserFragment/Activity { override fun onCreate(savedInstanceState: Bundle?) { userViewModel.liveEmail .observe( this , Observer { email -> updateUi(email) } ) } } LifecycleOwner null? val liveEmail : LiveData<String> LiveData<> Observer 👁 class UserFragment/Activity { override fun onCreate(savedInstanceState: Bundle?) { userViewModel.liveEmail .observeNonNull( this ) { email -> updateUi(email) } ) } } LiveData<> Activity/ Fragment (onCreate) 👁 API Service Repository (Database) LiveData newEmail@ address.com ViewModel LiveData<> Observable class UserViewModel { val liveEmail : LiveData<String> = ? } class UserViewModel { val roomDatabaseRepository = RoomDatabaseRepository .getInstance() val liveEmail : LiveData<String> get () = roomDatabaseRepository .getLiveEmail() } LiveData<> Observable class UserViewModel { val _liveEmail = MutableLiveData<String>() } LiveData<> Observable class UserViewModel { val _liveEmail = MutableLiveData<String>() fun updateEmail(email: String) { _liveEmail .postValue(email) } } Automatically on UI Thread LiveData<> Observable liveEmail.value == [last value] class UserViewModel { private val _liveEmail = MutableLiveData<String>() val liveEmail: LiveData<String> get () = liveEmailMutable fun updateEmail(email: String) { _liveEmail .postValue(email) } } LiveData<> Observable LiveData<> Activity/ Fragment (onCreate) 👁 API Service Repository (Database) LiveData oldEmail@ address.com newEmail@ address.com ViewModel update Email