# MediatorLiveData

Artifact: [androidx.lifecycle:lifecycle-livedata](https://developer.android.com/jetpack/androidx/releases/lifecycle) [View Source](https://cs.android.com/search?q=file:androidx/lifecycle/MediatorLiveData.java+class:androidx.lifecycle.MediatorLiveData) Added in [2.0.0](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.0.0)

*** ** * ** ***


```
public class MediatorLiveData<T> extends MutableLiveData<T>
```

<br />

|---|---|---|---|
| [java.lang.Object](https://developer.android.com/reference/java/lang/Object.html) ||||
| ↳ | [androidx.lifecycle.LiveData](https://developer.android.com/reference/androidx/lifecycle/LiveData) |||
|   | ↳ | [androidx.lifecycle.MutableLiveData](https://developer.android.com/reference/androidx/lifecycle/MutableLiveData)\<T\> ||
|   |   | ↳ | [androidx.lifecycle.MediatorLiveData](https://developer.android.com/reference/androidx/lifecycle/MediatorLiveData) |

*** ** * ** ***

`https://developer.android.com/reference/androidx/lifecycle/LiveData` subclass which may observe other `LiveData` objects and react on `OnChanged` events from them.

This class correctly propagates its active/inactive states down to source `LiveData` objects.

Consider the following scenario: we have 2 instances of `LiveData`, let's name them `liveData1` and `liveData2`, and we want to merge their emissions in one `https://developer.android.com/reference/androidx/lifecycle/MediatorLiveData` object: `liveDataMerger`. Then, `liveData1` and `
liveData2` will become sources for the `liveDataMerger` and every time `onChanged` callback is called for either of them, we set a new value in `liveDataMerger`.

```
LiveData<Integer> liveData1 = ...;
LiveData<Integer> liveData2 = ...;

MediatorLiveData<Integer> liveDataMerger = new MediatorLiveData<>();
liveDataMerger.addSource(liveData1, value -> liveDataMerger.setValue(value));
liveDataMerger.addSource(liveData2, value -> liveDataMerger.setValue(value));
```

Let's consider that we only want 10 values emitted by `liveData1`, to be merged in the `liveDataMerger`. Then, after 10 values, we can stop listening to `
liveData1` and remove it as a source.

```
liveDataMerger.addSource(liveData1, new Observer<Integer>() {
     private int count = 1;

     @Override public void onChanged(@Nullable Integer s) {
         count++;
         liveDataMerger.setValue(s);
         if (count > 10) {
             liveDataMerger.removeSource(liveData1);
         }
     }
});
```

| Parameters |
|---|---|
| `<T>` | The type of data hold by this instance |

## Summary

| ### Public constructors |
|---|
| `https://developer.android.com/reference/androidx/lifecycle/MediatorLiveData#MediatorLiveData()()` Creates a MediatorLiveData with no value assigned to it. |
| `https://developer.android.com/reference/androidx/lifecycle/MediatorLiveData#MediatorLiveData(T)(T value)` Creates a MediatorLiveData initialized with the given `value`. |

| ### Public methods |
|---|---|
| `void` | `@https://developer.android.com/reference/androidx/annotation/MainThread <S> https://developer.android.com/reference/androidx/lifecycle/MediatorLiveData#addSource(androidx.lifecycle.LiveData<S>,androidx.lifecycle.Observer<? super S>)(@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/lifecycle/LiveData<S> source, @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/lifecycle/Observer<S> onChanged)` Starts to listen to the given `source` LiveData, `onChanged` observer will be called when `source` value was changed. |
| `void` | `@https://developer.android.com/reference/androidx/annotation/MainThread <S> https://developer.android.com/reference/androidx/lifecycle/MediatorLiveData#removeSource(androidx.lifecycle.LiveData<S>)(@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/lifecycle/LiveData<S> toRemote)` Stops to listen the given `LiveData`. |

| ### Protected methods |
|---|---|
| `void` | `@https://developer.android.com/reference/androidx/annotation/CallSuper https://developer.android.com/reference/androidx/lifecycle/MediatorLiveData#onActive()()` Called when the number of active observers change from 0 to 1. |
| `void` | `@https://developer.android.com/reference/androidx/annotation/CallSuper https://developer.android.com/reference/androidx/lifecycle/MediatorLiveData#onInactive()()` Called when the number of active observers change from 1 to 0. |

### Inherited methods

From [androidx.lifecycle.LiveData](https://developer.android.com/reference/androidx/lifecycle/LiveData) `@https://jspecify.dev/docs/api/org/jspecify/annotations/Nullable.html T` `https://developer.android.com/reference/androidx/lifecycle/LiveData#getValue()()`

Returns the current value.
`boolean` `https://developer.android.com/reference/androidx/lifecycle/LiveData#hasActiveObservers()()`

Returns true if this LiveData has active observers.
`boolean` `https://developer.android.com/reference/androidx/lifecycle/LiveData#hasObservers()()`

Returns true if this LiveData has observers.
`boolean` `https://developer.android.com/reference/androidx/lifecycle/LiveData#isInitialized()()`

Returns whether an explicit value has been set on this LiveData.
`void` `@https://developer.android.com/reference/androidx/annotation/MainThread
https://developer.android.com/reference/androidx/lifecycle/LiveData#observe(androidx.lifecycle.LifecycleOwner,androidx.lifecycle.Observer<? super T>)(@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/lifecycle/LifecycleOwner owner, @https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/lifecycle/Observer<T> observer)`

Adds the given observer to the observers list within the lifespan of the given owner.
`void` `@https://developer.android.com/reference/androidx/annotation/MainThread
https://developer.android.com/reference/androidx/lifecycle/LiveData#observeForever(androidx.lifecycle.Observer<? super T>)(@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/lifecycle/Observer<T> observer)`

Adds the given observer to the observers list.
`void` `@https://developer.android.com/reference/androidx/annotation/MainThread
https://developer.android.com/reference/androidx/lifecycle/LiveData#removeObserver(androidx.lifecycle.Observer<? super T>)(@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/lifecycle/Observer<T> observer)`

Removes the given observer from the observers list.
`void` `@https://developer.android.com/reference/androidx/annotation/MainThread
https://developer.android.com/reference/androidx/lifecycle/LiveData#removeObservers(androidx.lifecycle.LifecycleOwner)(@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/lifecycle/LifecycleOwner owner)`

Removes all observers that are tied to the given `https://developer.android.com/reference/androidx/lifecycle/LifecycleOwner`.
From [androidx.lifecycle.MutableLiveData](https://developer.android.com/reference/androidx/lifecycle/MutableLiveData) `void` `https://developer.android.com/reference/androidx/lifecycle/MutableLiveData#postValue(T)(T value)`

Posts a task to a main thread to set the given value.
`void` `https://developer.android.com/reference/androidx/lifecycle/MutableLiveData#setValue(T)(T value)`

Sets the value.

## Public constructors

### MediatorLiveData

Added in [2.0.0](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.0.0)

```
public MediatorLiveData()
```

Creates a MediatorLiveData with no value assigned to it.

### MediatorLiveData

Added in [2.6.0](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.6.0)

```
public MediatorLiveData(T value)
```

Creates a MediatorLiveData initialized with the given `value`.

| Parameters |
|---|---|
| `T value` | initial value |

## Public methods

### addSource

Added in [2.0.0](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.0.0)

```
@MainThread
public void <S> addSource(@NonNull LiveData<S> source, @NonNull Observer<S> onChanged)
```

Starts to listen to the given `source` LiveData, `onChanged` observer will be called when `source` value was changed.

`onChanged` callback will be called only when this `MediatorLiveData` is active.

If the given LiveData is already added as a source but with a different Observer, `https://developer.android.com/reference/java/lang/IllegalArgumentException.html` will be thrown.

| Parameters |
|---|---|
| `<S>` | The type of data hold by `source` LiveData |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/lifecycle/LiveData<S> source` | the `LiveData` to listen to |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/lifecycle/Observer<S> onChanged` | The observer that will receive the events |

### removeSource

Added in [2.0.0](https://developer.android.com/jetpack/androidx/releases/lifecycle#2.0.0)

```
@MainThread
public void <S> removeSource(@NonNull LiveData<S> toRemote)
```

Stops to listen the given `LiveData`.

| Parameters |
|---|---|
| `<S>` | the type of data hold by `source` LiveData |
| `@https://jspecify.dev/docs/api/org/jspecify/annotations/NonNull.html https://developer.android.com/reference/androidx/lifecycle/LiveData<S> toRemote` | `LiveData` to stop to listen |

## Protected methods

### onActive

```
@CallSuper
protected void onActive()
```

Called when the number of active observers change from 0 to 1.

This callback can be used to know that this LiveData is being used thus should be kept up to date.

### onInactive

```
@CallSuper
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 `https://developer.android.com/reference/androidx/lifecycle/Lifecycle.State#STARTED` or `https://developer.android.com/reference/androidx/lifecycle/Lifecycle.State#RESUMED` (like an Activity in the back stack).

You can check if there are observers via `https://developer.android.com/reference/androidx/lifecycle/LiveData#hasObservers()`.