4

我有定义loadInitial和的 PositionalDataSource 的实现loadRange。分页工作正常,但是在某些边界条件下(可能与在退出屏幕时正在加载下一页有关)应用程序崩溃时出现androidx.paging.ContiguousPagedList$1.onPageError (ContiguousPagedList.java:153). 但是每个https://developer.android.com/reference/android/arch/paging/PositionalDataSource我的来源不是连续的?

在 ContiguousPagedList 的 onPageError 下发生崩溃,与 "todo" 一致:

public void onPageError(@PageResult.ResultType int resultType,
        @NonNull Throwable error, boolean retryable) {

   LoadState errorState = retryable ? LoadState.RETRYABLE_ERROR : LoadState.ERROR;

    if (resultType == PageResult.PREPEND) {
        mLoadStateManager.setState(LoadType.START, errorState, error);
    } else if (resultType == PageResult.APPEND) {
        mLoadStateManager.setState(LoadType.END, errorState, error);
    } else {
        // TODO: pass init signal through to *previous* list
        throw new IllegalStateException("TODO");
    }
}

我的配置没有使用占位符,也没有将总数传递给onResultof LoadInitialCallback。分页库的版本是 2.1.1

4

2 回答 2

2

至少目前没有好的和干净的解决方案(2.1.1 版)。

ContiguousPagedList 不支持初始化错误处理。您必须实现并行流来加载状态和自定义重试。

请参阅官方架构组件示例库中的示例。Yigit Boyar 通过从存储库返回自定义列表对象实现了一些流。

data class Listing<T>(
        // the LiveData of paged lists for the UI to observe
        val pagedList: LiveData<PagedList<T>>,
        // represents the network request status to show to the user
        val networkState: LiveData<NetworkState>,
        // represents the refresh status to show to the user. Separate from networkState, this
        // value is importantly only when refresh is requested.
        val refreshState: LiveData<NetworkState>,
        // refreshes the whole data and fetches it from scratch.
        val refresh: () -> Unit,
        // retries any failed requests.
        val retry: () -> Unit)

在这里查看数据源的实现

更新

经过多次不同的尝试,我最终从架构的核心部分中删除了 Jetpack,并将其仅保留在视图模型中,现在对我来说看起来更干净了。你可以在这里阅读

于 2020-02-19T15:47:37.973 回答
0

我遇到了同样的行为,因为当我的实现方法和方法callback.onError(e)发生异常时我调用了。为了防止应用程序崩溃,我删除了该行。我知道这不是解决方案,但至少我的应用程序不会随机崩溃。loadInitialloadAfterPageKeyedDataSourcecallback.onError(e)

示例代码(Kotlin+协程传入)

override fun loadInitial(params: LoadInitialParams<Long>, callback: LoadInitialCallback<Long, Beer>) {
    scope.launch {
        try {
            val response =
                BackendService.client.getBeers(
                    name = searchQueryNullable,
                    page = 1,
                    pageSize = params.requestedLoadSize
                )
            callback.onResult(response, 1, 2)
        } catch (e: Exception) {
            Log.e(tag, "Error loadInitial", e)
            // callback.onError(e) <-- this is the line that generates the crash: comment it
        }
    }
}
于 2020-02-07T14:17:05.283 回答