Class LiveData<T>
- Type Parameters:
T
- The type of data held by this instance
- Direct Known Subclasses:
MutableLiveData
Observer
can be added in a pair with a LifecycleOwner
, and
this observer will be notified about modifications of the wrapped data only if the paired
LifecycleOwner is in active state. LifecycleOwner is considered as active, if its state is
Lifecycle.State.STARTED
or Lifecycle.State.RESUMED
. An observer added via
observeForever(Observer)
is considered as always active and thus will always be notified
about modifications. For those observers, you should manually call
removeObserver(Observer)
.
An observer added with a Lifecycle will be automatically removed if the corresponding
Lifecycle moves to Lifecycle.State.DESTROYED
state. This is especially useful for
activities and fragments where they can safely observe LiveData and not worry about leaks:
they will be instantly unsubscribed when they are destroyed.
In addition, LiveData has onActive()
and onInactive()
methods
to get notified when number of active Observer
s change between 0 and 1.
This allows LiveData to release any heavy resources when it does not have any Observers that
are actively observing.
This class is designed to hold individual data fields of ViewModel
,
but can also be used for sharing data between different modules in your application
in a decoupled fashion.
An instance of this class takes a total of 240 bytes at least.
- See Also:
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptiongetValue()
Returns the current value.boolean
Returns true if this LiveData has active observers.boolean
Returns true if this LiveData has observers.void
observe
(LifecycleOwner owner, Observer<? super T> observer) Adds the given observer to the observers list within the lifespan of the given owner.void
observeForever
(Observer<? super T> observer) Adds the given observer to the observers list.protected void
onActive()
Called when the number of active observers change to 1 from 0.protected void
Called when the number of active observers change from 1 to 0.protected void
Posts a task to a main thread to set the given value.void
removeObserver
(Observer<? super T> observer) Removes the given observer from the observers list.void
removeObservers
(LifecycleOwner owner) Removes all observers that are tied to the givenLifecycleOwner
.protected void
Sets the value.
-
Constructor Details
-
LiveData
Creates a LiveData initialized with the givenvalue
.- Parameters:
value
- initial value
-
LiveData
public LiveData()Creates a LiveData with no value assigned to it.
-
-
Method Details
-
observe
Adds the given observer to the observers list within the lifespan of the given owner. The events are dispatched on the main thread. If LiveData already has data set, it will be delivered to the observer.The observer will only receive events if the owner is in
Lifecycle.State.STARTED
orLifecycle.State.RESUMED
state (active).If the owner moves to the
Lifecycle.State.DESTROYED
state, the observer will automatically be removed.When data changes while the
owner
is not active, it will not receive any updates. If it becomes active again, it will receive the last available data automatically.LiveData keeps a strong reference to the observer and the owner as long as the given LifecycleOwner is not destroyed. When it is destroyed, LiveData removes references to the observer & the owner.
If the given owner is already in
Lifecycle.State.DESTROYED
state, LiveData ignores the call.If the given owner, observer tuple is already in the list, the call is ignored. If the observer is already in the list with another owner, LiveData throws an
IllegalArgumentException
.- Parameters:
owner
- The LifecycleOwner which controls the observerobserver
- The observer that will receive the events
-
observeForever
Adds the given observer to the observers list. This call is similar toobserve(LifecycleOwner, Observer)
with a LifecycleOwner, which is always active. This means that the given observer will receive all events and will never be automatically removed. You should manually callremoveObserver(Observer)
to stop observing this LiveData. While LiveData has one of such observers, it will be considered as active.If the observer was already added with an owner to this LiveData, LiveData throws an
IllegalArgumentException
.- Parameters:
observer
- The observer that will receive the events
-
removeObserver
Removes the given observer from the observers list.- Parameters:
observer
- The Observer to receive events.
-
removeObservers
Removes all observers that are tied to the givenLifecycleOwner
.- Parameters:
owner
- TheLifecycleOwner
scope for the observers to be removed.
-
postValue
Posts a task to a main thread to set the given value. So if you have a following code executed in the main thread:liveData.postValue("a"); liveData.setValue("b");
The value "b" would be set at first and later the main thread would override it with the value "a".If you called this method multiple times before a main thread executed a posted task, only the last value would be dispatched.
- Parameters:
value
- The new value
-
setValue
Sets the value. If there are active observers, the value will be dispatched to them.This method must be called from the main thread. If you need set a value from a background thread, you can use
postValue(Object)
- Parameters:
value
- The new value
-
getValue
Returns the current value. Note that calling this method on a background thread does not guarantee that the latest value set will be received.- Returns:
- the current value
-
onActive
protected void onActive()Called when the number of active observers change to 1 from 0.This callback can be used to know that this LiveData is being used thus should be kept up to date.
-
onInactive
protected void onInactive()Called when the number of active observers change from 1 to 0.This does not mean that there are no observers left, there may still be observers but their lifecycle states aren't
Lifecycle.State.STARTED
orLifecycle.State.RESUMED
(like an Activity in the back stack).You can check if there are observers via
hasObservers()
. -
hasObservers
public boolean hasObservers()Returns true if this LiveData has observers.- Returns:
- true if this LiveData has observers
-
hasActiveObservers
public boolean hasActiveObservers()Returns true if this LiveData has active observers.- Returns:
- true if this LiveData has active observers
-