分页库DataSource.Factory用于多个数据源

Nid*_*hah 5 android android-architecture-components android-jetpack android-paging

新的分页库使我们可以指定一个自定义数据源以用于数据分页。github上的分页库文档和示例代码向我们展示了如何通过创建DataSource.Factory的子类来创建自定义数据源实例,如下所示:

class ConcertTimeDataSourceFactory(private val concertStartTime: Date) :
    DataSource.Factory<Date, Concert>() {
    val sourceLiveData = MutableLiveData<ConcertTimeDataSource>()
    override fun create(): DataSource<Date, Concert> {
        val source = ConcertTimeDataSource(concertStartTime)
        sourceLiveData.postValue(source)
        return source
    }
}
Run Code Online (Sandbox Code Playgroud)

在真实的应用程序中,通常会有带有recyclerviews的多个视图,因此会有多个自定义数据源。因此,您最终会为每个数据源创建DataSource.Factory的多个实现,还是有一个更通用的解决方案?

Kei*_*ati -3

正如应用程序架构指南中所见,建议使用单一事实来源,因此无论您拥有多少个数据源,都应该只有一个事实来源。

分页库中使用的示例都依赖于这一事实,这就是分页库默认支持 Room 的原因。但这并不意味着您必须使用数据库,事实上:

在此模型中,数据库充当单一事实来源,应用程序的其他部分通过存储库访问它。无论您是否使用磁盘缓存,我们都建议您的存储库指定一个数据源作为应用程序其余部分的单一事实来源。

PS:即使您不想指定单个事实来源,也不必定义多个DataSource事实来源,您只需实现一个自定义数据源即可组合多个数据流来创建可显示的项目列表。例如:

public class MentionKeyedDataSource extends ItemKeyedDataSource<Long, Mention> {

    private Repository repository;
    ...
    private List<Mention> cachedItems;

    public MentionKeyedDataSource(Repository repository, ..., List<Mention> cachedItems){
        super();

        this.repository = repository;
        ...
        this.cachedItems = new ArrayList<>(cachedItems);
    }

    @Override
    public void loadInitial(@NonNull LoadInitialParams<Long> params, final @NonNull ItemKeyedDataSource.LoadInitialCallback<Mention> callback) {
        Observable.just(cachedItems)
                .filter(() -> return cachedItems != null && !cachedItems.isEmpty())
                .switchIfEmpty(repository.getItems(params.requestedLoadSize))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(response -> callback.onResult(response.data.list));
    }
    ...
Run Code Online (Sandbox Code Playgroud)

  • 这根本不能解释问题。 (10认同)