| <html devsite="true"> |
| <head> |
| <title>RemoteMediator</title> |
| {% setvar book_path %}/reference/androidx/_book.yaml{% endsetvar %} |
| {% include "_shared/_reference-head-tags.html" %} |
| </head> |
| <body> |
| <div id="metadata-info-block"></div> |
| <h1>RemoteMediator</h1> |
| <p> |
| <pre>@<a href="/reference/androidx/paging/ExperimentalPagingApi.html">ExperimentalPagingApi</a><br>public abstract class <a href="/reference/androidx/paging/RemoteMediator.html">RemoteMediator</a><Key extends <a href="https://developer.android.com/reference/java/lang/Object.html">Object</a>, Value extends <a href="https://developer.android.com/reference/java/lang/Object.html">Object</a>></pre> |
| </p> |
| <div class="devsite-table-wrapper"><devsite-expandable><span class="expand-control jd-sumtable-subclasses">Known direct subclasses |
| <div class="showalways" id="subclasses-direct"><a href="/reference/androidx/paging/ListenableFutureRemoteMediator.html">ListenableFutureRemoteMediator</a>, <a href="/reference/androidx/paging/rxjava2/RxRemoteMediator.html">RxRemoteMediator</a>, <a href="/reference/androidx/paging/rxjava3/RxRemoteMediator.html">RxRemoteMediator</a></div> |
| </span> |
| <div id="subclasses-direct-summary"> |
| <div class="devsite-table-wrapper"> |
| <table class="responsive"> |
| <colgroup> |
| <col width="40%"> |
| <col> |
| </colgroup> |
| <tbody class="list"> |
| <tr> |
| <td width="40%"><code><a href="/reference/androidx/paging/ListenableFutureRemoteMediator.html">ListenableFutureRemoteMediator</a></code></td> |
| <td> |
| <p><code><a href="https://guava.dev/releases/18.0/api/docs/package-list/com/google/common/util/concurrent/ListenableFuture.html">ListenableFuture</a></code>-based compatibility wrapper around <code><a href="/reference/androidx/paging/RemoteMediator.html">RemoteMediator</a></code>'s suspending APIs.</p> |
| </td> |
| </tr> |
| <tr> |
| <td width="40%"><code><a href="/reference/androidx/paging/rxjava2/RxRemoteMediator.html">RxRemoteMediator</a></code></td> |
| <td> |
| <p>RxJava2 compatibility wrapper around <code><a href="/reference/androidx/paging/RemoteMediator.html">RemoteMediator</a></code>'s suspending APIs.</p> |
| </td> |
| </tr> |
| <tr> |
| <td width="40%"><code><a href="/reference/androidx/paging/rxjava3/RxRemoteMediator.html">RxRemoteMediator</a></code></td> |
| <td> |
| <p>RxJava3 compatibility wrapper around <code><a href="/reference/androidx/paging/RemoteMediator.html">RemoteMediator</a></code>'s suspending APIs.</p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| </devsite-expandable> </div> |
| <hr> |
| <p>Defines a set of callbacks used to incrementally load data from a remote source into a local source wrapped by a <code><a href="/reference/androidx/paging/PagingSource.html">PagingSource</a></code>, e.g., loading data from network into a local db cache.</p> |
| <p>A <code><a href="/reference/androidx/paging/RemoteMediator.html">RemoteMediator</a></code> is registered by passing it to <code><a href="/reference/androidx/paging/Pager.html">Pager</a></code>'s constructor.</p> |
| <p><code><a href="/reference/androidx/paging/RemoteMediator.html">RemoteMediator</a></code> allows hooking into the following events:</p> |
| <ul> |
| <li> |
| <p>Stream initialization</p> |
| </li> |
| <li> |
| <p><code><a href="/reference/androidx/paging/LoadType.html#REFRESH">REFRESH</a></code> signal driven from UI</p> |
| </li> |
| <li> |
| <p><code><a href="/reference/androidx/paging/PagingSource.html">PagingSource</a></code> returns a <code><a href="/reference/androidx/paging/PagingSource.LoadResult.html">LoadResult</a></code> which signals a boundary condition, i.e., the most recent <code><a href="/reference/androidx/paging/PagingSource.LoadResult.Page.html">LoadResult.Page</a></code> in the <code><a href="/reference/androidx/paging/LoadType.html#PREPEND">PREPEND</a></code> or <code><a href="/reference/androidx/paging/LoadType.html#APPEND">APPEND</a></code> direction has <code><a href="/reference/androidx/paging/PagingSource.LoadResult.Page.html#prevKey()">LoadResult.Page.prevKey</a></code> or <code><a href="/reference/androidx/paging/PagingSource.LoadResult.Page.html#nextKey()">LoadResult.Page.nextKey</a></code> set to <code>null</code> respectively.</p> |
| </li> |
| </ul> |
| <pre class="prettyprint"> |
| import androidx.room.withTransaction |
| |
| /** |
| * Sample RemoteMediator for a DB + Network based PagingData stream, which triggers network |
| * requests to fetch additional items when a user scrolls to the end of the list of items stored |
| * in DB. |
| * |
| * This sample loads a list of [User] items from an item-keyed Retrofit paginated source. This |
| * source is "item-keyed" because we're loading the next page using information from the items |
| * themselves (the ID param) as a key to fetch more data. |
| */ |
| @OptIn(ExperimentalPagingApi::class) |
| class ExampleRemoteMediator( |
| private val query: String, |
| private val database: RoomDb, |
| private val networkService: ExampleBackendService |
| ) : RemoteMediator<Int, User>() { |
| val userDao = database.userDao() |
| |
| override suspend fun initialize(): InitializeAction { |
| val cacheTimeout = TimeUnit.HOURS.convert(1, TimeUnit.MILLISECONDS) |
| return if (System.currentTimeMillis() - userDao.lastUpdated() >= cacheTimeout) { |
| // Cached data is up-to-date, so there is no need to re-fetch from network. |
| InitializeAction.SKIP_INITIAL_REFRESH |
| } else { |
| // Need to refresh cached data from network; returning LAUNCH_INITIAL_REFRESH here |
| // will also block RemoteMediator's APPEND and PREPEND from running until REFRESH |
| // succeeds. |
| InitializeAction.LAUNCH_INITIAL_REFRESH |
| } |
| } |
| |
| override suspend fun load( |
| loadType: LoadType, |
| state: PagingState<Int, User> |
| ): MediatorResult { |
| return try { |
| // The network load method takes an optional `after=<user.id>` parameter. For every |
| // page after the first, we pass the last user ID to let it continue from where it |
| // left off. For REFRESH, pass `null` to load the first page. |
| val loadKey = when (loadType) { |
| LoadType.REFRESH -> null |
| // In this example, we never need to prepend, since REFRESH will always load the |
| // first page in the list. Immediately return, reporting end of pagination. |
| LoadType.PREPEND -> return MediatorResult.Success(endOfPaginationReached = true) |
| LoadType.APPEND -> { |
| val lastItem = state.lastItemOrNull() |
| |
| // We must explicitly check if the last item is `null` when appending, |
| // since passing `null` to networkService is only valid for initial load. |
| // If lastItem is `null` it means no items were loaded after the initial |
| // REFRESH and there are no more items to load. |
| if (lastItem == null) { |
| return MediatorResult.Success(endOfPaginationReached = true) |
| } |
| |
| lastItem.id |
| } |
| } |
| |
| // Suspending network load via Retrofit. This doesn't need to be wrapped in a |
| // withContext(Dispatcher.IO) { ... } block since Retrofit's Coroutine CallAdapter |
| // dispatches on a worker thread. |
| val response = networkService.searchUsers(query = query, after = loadKey) |
| |
| database.withTransaction { |
| if (loadType == LoadType.REFRESH) { |
| userDao.deleteByQuery(query) |
| } |
| |
| // Insert new users into database, which invalidates the current |
| // PagingData, allowing Paging to present the updates in the DB. |
| userDao.insertAll(response.users) |
| } |
| |
| MediatorResult.Success(endOfPaginationReached = response.nextKey == null) |
| } catch (e: IOException) { |
| MediatorResult.Error(e) |
| } catch (e: HttpException) { |
| MediatorResult.Error(e) |
| } |
| } |
| }</pre> |
| <pre class="prettyprint"> |
| import androidx.paging.samples.shared.RemoteKey |
| import androidx.room.withTransaction |
| |
| /** |
| * Sample RemoteMediator for a DB + Network based PagingData stream, which triggers network |
| * requests to fetch additional items when a user scrolls to the end of the list of items stored |
| * in DB. |
| * |
| * This sample loads a list of [User] via Retrofit from a page-keyed network service using |
| * [String] tokens to load pages (each response has a next/previous token), and inserts them |
| * into database. |
| */ |
| @OptIn(ExperimentalPagingApi::class) |
| class ExampleRemoteMediator( |
| private val query: String, |
| private val database: RoomDb, |
| private val networkService: ExampleBackendService |
| ) : RemoteMediator<Int, User>() { |
| val userDao = database.userDao() |
| val remoteKeyDao = database.remoteKeyDao() |
| |
| override suspend fun initialize(): InitializeAction { |
| val cacheTimeout = TimeUnit.HOURS.convert(1, TimeUnit.MILLISECONDS) |
| return if (System.currentTimeMillis() - userDao.lastUpdated() >= cacheTimeout) { |
| // Cached data is up-to-date, so there is no need to re-fetch from network. |
| InitializeAction.SKIP_INITIAL_REFRESH |
| } else { |
| // Need to refresh cached data from network; returning LAUNCH_INITIAL_REFRESH here |
| // will also block RemoteMediator's APPEND and PREPEND from running until REFRESH |
| // succeeds. |
| InitializeAction.LAUNCH_INITIAL_REFRESH |
| } |
| } |
| |
| override suspend fun load( |
| loadType: LoadType, |
| state: PagingState<Int, User> |
| ): MediatorResult { |
| return try { |
| // The network load method takes an optional [String] parameter. For every page |
| // after the first, we pass the [String] token returned from the previous page to |
| // let it continue from where it left off. For REFRESH, pass `null` to load the |
| // first page. |
| val loadKey = when (loadType) { |
| LoadType.REFRESH -> null |
| // In this example, we never need to prepend, since REFRESH will always load the |
| // first page in the list. Immediately return, reporting end of pagination. |
| LoadType.PREPEND -> return MediatorResult.Success(endOfPaginationReached = true) |
| // Query remoteKeyDao for the next RemoteKey. |
| LoadType.APPEND -> { |
| val remoteKey = database.withTransaction { |
| remoteKeyDao.remoteKeyByQuery(query) |
| } |
| |
| // We must explicitly check if the page key is `null` when appending, |
| // since `null` is only valid for initial load. If we receive `null` |
| // for APPEND, that means we have reached the end of pagination and |
| // there are no more items to load. |
| if (remoteKey.nextKey == null) { |
| return MediatorResult.Success(endOfPaginationReached = true) |
| } |
| |
| remoteKey.nextKey |
| } |
| } |
| |
| // Suspending network load via Retrofit. This doesn't need to be wrapped in a |
| // withContext(Dispatcher.IO) { ... } block since Retrofit's Coroutine CallAdapter |
| // dispatches on a worker thread. |
| val response = networkService.searchUsers(query, loadKey) |
| |
| // Store loaded data, and next key in transaction, so that they're always consistent |
| database.withTransaction { |
| if (loadType == LoadType.REFRESH) { |
| remoteKeyDao.deleteByQuery(query) |
| userDao.deleteByQuery(query) |
| } |
| |
| // Update RemoteKey for this query. |
| remoteKeyDao.insertOrReplace(RemoteKey(query, response.nextKey)) |
| |
| // Insert new users into database, which invalidates the current |
| // PagingData, allowing Paging to present the updates in the DB. |
| userDao.insertAll(response.users) |
| } |
| |
| MediatorResult.Success(endOfPaginationReached = response.nextKey == null) |
| } catch (e: IOException) { |
| MediatorResult.Error(e) |
| } catch (e: HttpException) { |
| MediatorResult.Error(e) |
| } |
| } |
| }</pre> |
| <h2>Summary</h2> |
| <div class="devsite-table-wrapper"> |
| <table class="responsive"> |
| <colgroup> |
| <col width="40%"> |
| <col> |
| </colgroup> |
| <thead> |
| <tr> |
| <th colspan="100%"><h3>Nested types</h3></th> |
| </tr> |
| </thead> |
| <tbody class="list"> |
| <tr> |
| <td> |
| <div><code>public enum <a href="/reference/androidx/paging/RemoteMediator.InitializeAction.html">RemoteMediator.InitializeAction</a> extends <a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html">Enum</a></code></div> |
| <p>Return type of <code><a href="/reference/androidx/paging/RemoteMediator.html#initialize()">initialize</a></code>, which signals the action to take after <code><a href="/reference/androidx/paging/RemoteMediator.html#initialize()">initialize</a></code> completes.</p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <div><code>public class <a href="/reference/androidx/paging/RemoteMediator.MediatorResult.html">RemoteMediator.MediatorResult</a></code></div> |
| <p>Return type of <code><a href="/reference/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code>, which determines <code><a href="/reference/androidx/paging/LoadState.html">LoadState</a></code>.</p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <div><code>public final class <a href="/reference/androidx/paging/RemoteMediator.MediatorResult.Error.html">RemoteMediator.MediatorResult.Error</a> extends <a href="/reference/androidx/paging/RemoteMediator.MediatorResult.html">RemoteMediator.MediatorResult</a></code></div> |
| <p>Recoverable error that can be retried, sets the <code><a href="/reference/androidx/paging/LoadState.html">LoadState</a></code> to <code><a href="/reference/androidx/paging/LoadState.Error.html">LoadState.Error</a></code>.</p> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <div><code>public final class <a href="/reference/androidx/paging/RemoteMediator.MediatorResult.Success.html">RemoteMediator.MediatorResult.Success</a> extends <a href="/reference/androidx/paging/RemoteMediator.MediatorResult.html">RemoteMediator.MediatorResult</a></code></div> |
| <p>Success signaling that <code><a href="/reference/androidx/paging/LoadState.html">LoadState</a></code> should be set to <code><a href="/reference/androidx/paging/LoadState.NotLoading.html">LoadState.NotLoading</a></code> if <code><a href="/reference/androidx/paging/RemoteMediator.MediatorResult.Success.html#endOfPaginationReached()">endOfPaginationReached</a></code> is <code>true</code>, otherwise <code><a href="/reference/androidx/paging/LoadState.html">LoadState</a></code> is kept at <code><a href="/reference/androidx/paging/LoadState.Loading.html">LoadState.Loading</a></code> to await invalidation.</p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <div class="devsite-table-wrapper"> |
| <table class="responsive"> |
| <colgroup> |
| <col width="40%"> |
| <col> |
| </colgroup> |
| <thead> |
| <tr> |
| <th colspan="100%"><h3>Public constructors</h3></th> |
| </tr> |
| </thead> |
| <tbody class="list"> |
| <tr> |
| <td> |
| <div><code><Key extends <a href="https://developer.android.com/reference/java/lang/Object.html">Object</a>, Value extends <a href="https://developer.android.com/reference/java/lang/Object.html">Object</a>> <a href="/reference/androidx/paging/RemoteMediator.html#RemoteMediator()">RemoteMediator</a>()</code></div> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <div class="devsite-table-wrapper"> |
| <table class="responsive"> |
| <colgroup> |
| <col width="40%"> |
| <col> |
| </colgroup> |
| <thead> |
| <tr> |
| <th colspan="100%"><h3>Public methods</h3></th> |
| </tr> |
| </thead> |
| <tbody class="list"> |
| <tr> |
| <td width="40%"><code>@<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> <a href="/reference/androidx/paging/RemoteMediator.InitializeAction.html">RemoteMediator.InitializeAction</a></code></td> |
| <td> |
| <div><code><a href="/reference/androidx/paging/RemoteMediator.html#initialize()">initialize</a>()</code></div> |
| <p>Callback fired during initialization of a <code><a href="/reference/androidx/paging/PagingData.html">PagingData</a></code> stream, before initial load.</p> |
| </td> |
| </tr> |
| <tr> |
| <td width="40%"><code>abstract @<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> <a href="/reference/androidx/paging/RemoteMediator.MediatorResult.html">RemoteMediator.MediatorResult</a></code></td> |
| <td> |
| <div><code><a href="/reference/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a>(<br> @<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> <a href="/reference/androidx/paging/LoadType.html">LoadType</a> loadType,<br> @<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> <a href="/reference/androidx/paging/PagingState.html">PagingState</a><@<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> Key, @<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> Value> state<br>)</code></div> |
| <p>Callback triggered when Paging needs to request more data from a remote source due to any of the following events:</p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <div class="list"> |
| <h2>Public constructors</h2> |
| <div class="api-item"><a name="RemoteMediator--"></a><a name="remotemediator"></a> |
| <h3 class="api-name" id="RemoteMediator()">RemoteMediator</h3> |
| <pre class="api-signature no-pretty-print">public <Key extends <a href="https://developer.android.com/reference/java/lang/Object.html">Object</a>, Value extends <a href="https://developer.android.com/reference/java/lang/Object.html">Object</a>> <a href="/reference/androidx/paging/RemoteMediator.html#RemoteMediator()">RemoteMediator</a>()</pre> |
| </div> |
| </div> |
| <div class="list"> |
| <h2>Public methods</h2> |
| <div class="api-item"><a name="initialize--"></a><a name="initialize"></a> |
| <h3 class="api-name" id="initialize()">initialize</h3> |
| <pre class="api-signature no-pretty-print">public @<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> <a href="/reference/androidx/paging/RemoteMediator.InitializeAction.html">RemoteMediator.InitializeAction</a> <a href="/reference/androidx/paging/RemoteMediator.html#initialize()">initialize</a>()</pre> |
| <p>Callback fired during initialization of a <code><a href="/reference/androidx/paging/PagingData.html">PagingData</a></code> stream, before initial load.</p> |
| <p>This function runs to completion before any loading is performed.</p> |
| <div class="devsite-table-wrapper"> |
| <table class="responsive"> |
| <colgroup> |
| <col width="40%"> |
| <col> |
| </colgroup> |
| <thead> |
| <tr> |
| <th colspan="100%">Returns</th> |
| </tr> |
| </thead> |
| <tbody class="list"> |
| <tr> |
| <td width="40%"><code>@<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> <a href="/reference/androidx/paging/RemoteMediator.InitializeAction.html">RemoteMediator.InitializeAction</a></code></td> |
| <td> |
| <p><code><a href="/reference/androidx/paging/RemoteMediator.InitializeAction.html">InitializeAction</a></code> used to control whether <code><a href="/reference/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code> with load type <code><a href="/reference/androidx/paging/LoadType.html#REFRESH">REFRESH</a></code> will be immediately dispatched when the first <code><a href="/reference/androidx/paging/PagingData.html">PagingData</a></code> is submitted:</p> |
| <ul> |
| <li> |
| <p><code><a href="/reference/androidx/paging/RemoteMediator.InitializeAction.html#LAUNCH_INITIAL_REFRESH">LAUNCH_INITIAL_REFRESH</a></code> to immediately dispatch <code><a href="/reference/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code> asynchronously with load type <code><a href="/reference/androidx/paging/LoadType.html#REFRESH">REFRESH</a></code>, to update paginated content when the stream is initialized. Note: This also prevents <code><a href="/reference/androidx/paging/RemoteMediator.html">RemoteMediator</a></code> from triggering <code><a href="/reference/androidx/paging/LoadType.html#PREPEND">PREPEND</a></code> or <code><a href="/reference/androidx/paging/LoadType.html#APPEND">APPEND</a></code> until <code><a href="/reference/androidx/paging/LoadType.html#REFRESH">REFRESH</a></code> succeeds.</p> |
| </li> |
| <li> |
| <p><code><a href="/reference/androidx/paging/RemoteMediator.InitializeAction.html#SKIP_INITIAL_REFRESH">SKIP_INITIAL_REFRESH</a></code> to wait for a refresh request from the UI before dispatching <code><a href="/reference/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code> asynchronously with load type <code><a href="/reference/androidx/paging/LoadType.html#REFRESH">REFRESH</a></code>.</p> |
| </li> |
| </ul> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| <div class="api-item"><a name="load(androidx.paging.LoadType, androidx.paging.PagingState)"></a><a name="load-androidx.paging.LoadType-androidx.paging.PagingState-"></a><a name="load"></a> |
| <h3 class="api-name" id="load(androidx.paging.LoadType,androidx.paging.PagingState)">load</h3> |
| <pre class="api-signature no-pretty-print">public abstract @<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> <a href="/reference/androidx/paging/RemoteMediator.MediatorResult.html">RemoteMediator.MediatorResult</a> <a href="/reference/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a>(<br> @<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> <a href="/reference/androidx/paging/LoadType.html">LoadType</a> loadType,<br> @<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> <a href="/reference/androidx/paging/PagingState.html">PagingState</a><@<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> Key, @<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> Value> state<br>)</pre> |
| <p>Callback triggered when Paging needs to request more data from a remote source due to any of the following events:</p> |
| <ul> |
| <li> |
| <p>Stream initialization if <code><a href="/reference/androidx/paging/RemoteMediator.html#initialize()">initialize</a></code> returns <code><a href="/reference/androidx/paging/RemoteMediator.InitializeAction.html#LAUNCH_INITIAL_REFRESH">LAUNCH_INITIAL_REFRESH</a></code></p> |
| </li> |
| <li> |
| <p><code><a href="/reference/androidx/paging/LoadType.html#REFRESH">REFRESH</a></code> signal driven from UI</p> |
| </li> |
| <li> |
| <p><code><a href="/reference/androidx/paging/PagingSource.html">PagingSource</a></code> returns a <code><a href="/reference/androidx/paging/PagingSource.LoadResult.html">LoadResult</a></code> which signals a boundary condition, i.e., the most recent <code><a href="/reference/androidx/paging/PagingSource.LoadResult.Page.html">LoadResult.Page</a></code> in the <code><a href="/reference/androidx/paging/LoadType.html#PREPEND">PREPEND</a></code> or <code><a href="/reference/androidx/paging/LoadType.html#APPEND">APPEND</a></code> direction has <code><a href="/reference/androidx/paging/PagingSource.LoadResult.Page.html#prevKey()">LoadResult.Page.prevKey</a></code> or <code><a href="/reference/androidx/paging/PagingSource.LoadResult.Page.html#nextKey()">LoadResult.Page.nextKey</a></code> set to <code>null</code> respectively.</p> |
| </li> |
| </ul> |
| <p>It is the responsibility of this method to update the backing dataset and trigger <code><a href="/reference/androidx/paging/PagingSource.html#invalidate()">PagingSource.invalidate</a></code> to allow <code><a href="/reference/androidx/paging/PagingDataAdapter.html">androidx.paging.PagingDataAdapter</a></code> to pick up new items found by <code><a href="/reference/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code>.</p> |
| <p>The runtime and result of this method defines the remote <code><a href="/reference/androidx/paging/LoadState.html">LoadState</a></code> behavior sent to the UI via <code><a href="/reference/androidx/paging/CombinedLoadStates.html">CombinedLoadStates</a></code>.</p> |
| <p>This method is never called concurrently <em>unless</em> <code><a href="/reference/androidx/paging/Pager.html#flow()">Pager.flow</a></code> has multiple collectors. Note that Paging might cancel calls to this function if it is currently executing a <code><a href="/reference/androidx/paging/LoadType.html#PREPEND">PREPEND</a></code> or <code><a href="/reference/androidx/paging/LoadType.html#APPEND">APPEND</a></code> and a <code><a href="/reference/androidx/paging/LoadType.html#REFRESH">REFRESH</a></code> is requested. In that case, <code><a href="/reference/androidx/paging/LoadType.html#REFRESH">REFRESH</a></code> has higher priority and will be executed after the previous call is cancelled. If the <code><a href="/reference/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code> call with <code><a href="/reference/androidx/paging/LoadType.html#REFRESH">REFRESH</a></code> returns an error, Paging will call <code><a href="/reference/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code> with the previously cancelled <code><a href="/reference/androidx/paging/LoadType.html#APPEND">APPEND</a></code> or <code><a href="/reference/androidx/paging/LoadType.html#PREPEND">PREPEND</a></code> request. If <code><a href="/reference/androidx/paging/LoadType.html#REFRESH">REFRESH</a></code> succeeds, it won't make the <code><a href="/reference/androidx/paging/LoadType.html#APPEND">APPEND</a></code> or <code><a href="/reference/androidx/paging/LoadType.html#PREPEND">PREPEND</a></code> requests unless they are necessary again after the <code><a href="/reference/androidx/paging/LoadType.html#REFRESH">REFRESH</a></code> is applied to the UI.</p> |
| <div class="devsite-table-wrapper"> |
| <table class="responsive"> |
| <colgroup> |
| <col width="40%"> |
| <col> |
| </colgroup> |
| <thead> |
| <tr> |
| <th colspan="100%">Parameters</th> |
| </tr> |
| </thead> |
| <tbody class="list"> |
| <tr> |
| <td width="40%"><code>@<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> <a href="/reference/androidx/paging/LoadType.html">LoadType</a> loadType</code></td> |
| <td> |
| <p><code><a href="/reference/androidx/paging/LoadType.html">LoadType</a></code> of the condition which triggered this callback.</p> |
| <ul> |
| <li> |
| <p><code><a href="/reference/androidx/paging/LoadType.html#PREPEND">PREPEND</a></code> indicates the end of pagination in the <code><a href="/reference/androidx/paging/LoadType.html#PREPEND">PREPEND</a></code> direction was reached. This occurs when <code><a href="/reference/androidx/paging/PagingSource.html#load(androidx.paging.PagingSource.LoadParams)">PagingSource.load</a></code> returns a <code><a href="/reference/androidx/paging/PagingSource.LoadResult.Page.html">LoadResult.Page</a></code> with <code><a href="/reference/androidx/paging/PagingSource.LoadResult.Page.html#prevKey()">LoadResult.Page.prevKey</a></code> == <code>null</code>.</p> |
| </li> |
| <li> |
| <p><code><a href="/reference/androidx/paging/LoadType.html#APPEND">APPEND</a></code> indicates the end of pagination in the <code><a href="/reference/androidx/paging/LoadType.html#APPEND">APPEND</a></code> direction was reached. This occurs when <code><a href="/reference/androidx/paging/PagingSource.html#load(androidx.paging.PagingSource.LoadParams)">PagingSource.load</a></code> returns a <code><a href="/reference/androidx/paging/PagingSource.LoadResult.Page.html">LoadResult.Page</a></code> with <code><a href="/reference/androidx/paging/PagingSource.LoadResult.Page.html#nextKey()">LoadResult.Page.nextKey</a></code> == <code>null</code>.</p> |
| </li> |
| <li> |
| <p><code><a href="/reference/androidx/paging/LoadType.html#REFRESH">REFRESH</a></code> indicates this method was triggered due to a requested refresh. Generally, this means that a request to load remote data and <b>replace</b> all local data was made. This can happen when:</p> |
| </li> |
| <ul> |
| <li> |
| <p>Stream initialization if <code><a href="/reference/androidx/paging/RemoteMediator.html#initialize()">initialize</a></code> returns <code><a href="/reference/androidx/paging/RemoteMediator.InitializeAction.html#LAUNCH_INITIAL_REFRESH">LAUNCH_INITIAL_REFRESH</a></code></p> |
| </li> |
| <li> |
| <p>An explicit call to refresh driven by the UI</p> |
| </li> |
| </ul> |
| </ul> |
| </td> |
| </tr> |
| <tr> |
| <td width="40%"><code>@<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> <a href="/reference/androidx/paging/PagingState.html">PagingState</a><@<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> Key, @<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> Value> state</code></td> |
| <td> |
| <p>A copy of the state including the list of pages currently held in memory of the currently presented <code><a href="/reference/androidx/paging/PagingData.html">PagingData</a></code> at the time of starting the load. E.g. for load(loadType = APPEND), you can use the page or item at the end as input for what to load from the network.</p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <div class="devsite-table-wrapper"> |
| <table class="responsive"> |
| <colgroup> |
| <col width="40%"> |
| <col> |
| </colgroup> |
| <thead> |
| <tr> |
| <th colspan="100%">Returns</th> |
| </tr> |
| </thead> |
| <tbody class="list"> |
| <tr> |
| <td width="40%"><code>@<a href="/reference/androidx/annotation/NonNull.html">NonNull</a> <a href="/reference/androidx/paging/RemoteMediator.MediatorResult.html">RemoteMediator.MediatorResult</a></code></td> |
| <td> |
| <p><code><a href="/reference/androidx/paging/RemoteMediator.MediatorResult.html">MediatorResult</a></code> signifying what <code><a href="/reference/androidx/paging/LoadState.html">LoadState</a></code> to be passed to the UI, and whether there's more data available.</p> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| </div> |
| </body> |
| </html> |