返回

处理Paging刷新后数据清理的实战经验

Android

前言

在移动应用程序开发中,分页是处理大量数据集合的常见技术。Android Paging 3库简化了这一过程,但同时也引入了数据刷新后数据清理的问题。本文将分享我们在实际项目中遇到的需求与困难,并探讨如何使用Paging 3解决这些问题。

需求与困难

我们在项目中遇到了一个实际业务需求:在列表刷新数据后无论成功失败都必须将原有数据清空。

  • 成功场景:空数据直接清空旧数据,新数据更新进列表。
  • 失败场景:刷新请求出错时需要清空数据,在传统开发方式中很容易实现,但在使用Paging 3库时带来了挑战。

解决方案

为了解决这些问题,我们采用了以下解决方案:

LiveData与Paging Adapter

我们使用LiveData作为数据源,并将Paging Adapter与LiveData连接。这样,无论刷新成功或失败,Adapter都会收到更新并相应地更新列表。

处理失败场景

对于失败场景,我们自定义了一个PagingErrorHandle,它继承自PagingSource.LoadResult.Error,并包含了错误消息。在PagingSource中处理加载错误时,我们将自定义错误返回到Paging adapter,以触发数据清理。

代码示例

class MyPagingSource : PagingSource<Int, MyDataItem>() {
    override suspend fun load(params: LoadParams<Int>) = loadInternal {
        try {
            val data = loadFromRemote(params.key)
            LoadResult.Page(data, prevKey, nextKey, null)
        } catch (e: Exception) {
            LoadResult.Error(MyPagingErrorHandle(e.message))
        }
    }
}

class MyPagingAdapter : PagingDataAdapter<MyDataItem, MyViewHolder>(DIFF_CALLBACK) {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        return MyViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_data, parent, false))
    }

    override fun onCurrentListChanged(previousList: MutableList<MyDataItem>, currentList: MutableList<MyDataItem>) {
        super.onCurrentListChanged(previousList, currentList)
        if (currentList.isEmpty()) {
            // 数据为空,清空旧数据
            viewModel.clearData()
        }
    }

    override fun onFailed(loadType: LoadType, error: Throwable) {
        super.onFailed(loadType, error)
        if (error is MyPagingErrorHandle) {
            // 加载失败,清空旧数据
            viewModel.clearData()
        }
    }
}

结论

通过结合LiveData、Paging Adapter和自定义错误处理,我们成功解决了在Paging 3库中刷新数据后数据清理的问题。这种方法为处理成功和失败场景提供了通用的解决方案,确保数据在任何情况下都得到正确处理。