【问题标题】:Get Android Paging 3.0 with RxJava working in Java (not Kotlin)使用在 Java(不是 Kotlin)中工作的 RxJava 获取 Android Paging 3.0
【发布时间】:2020-07-01 06:55:55
【问题描述】:

按照 Paging 3 documentation,我设法让 Paging 库 3.0.0-alpha02 在 Kotlin 应用程序中与 RxJava2 一起使用。

但是,当我将分页代码移植到 Java 应用程序时,我遇到了一个问题,即数据是按页面检索的,但即使我不滚动回收站视图,页面检索也会在后台继续进行。也就是说,在加载第1页之后,它会加载第2、3、4页等,然后继续。

我正在视图模型中设置分页:

public Observable<PagingData<Item>> loadItems()
{

  PagingConfig config = new PagingConfig(...);

  Pager<Integer, Message> pager = new Pager<Integer, Item>(config, null, null,
                                        () -> new MyPagingSource());

  return PagingRx.getObservable(pager) 
}

然后订阅activity/fragment:

        disposable = viewModel.loadItems()
            .subscribe( pagingData -> {
            getAdapter().submitData(getLifecycle(), pagingData);
        });

在 Java 应用程序中,我订阅的是片段而不是活动,但其他代码与 Kotlin 应用程序相同。

我意识到分页库3使用协程和内部流,所以我添加了这个依赖但它没有任何区别。

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.3.7'

编辑:

Kotlin 演示应用位于 GitHub 上,具有 RxJava 和 Flow 版本(基于 Android 示例)。它会在 Telephony 内容提供商上进行寻呼以获取 SMS 收件箱消息。

【问题讨论】:

    标签: java android kotlin rx-java2 paging


    【解决方案1】:

    PagingSource.load 是基于PagingConfig.prefetchDistance 自动触发的,因为项目绑定到RecyclerView。这意味着即使您不滚动,Paging 也会尝试根据可见视口完成项目。

    无论您使用哪种语言,终止加载的行为都是相同的,但它基于 prev/nextKeynull 中的 PagingSourcePagingSource 中的 LoadResult.PageRemoteMediator 中的 endOfPaginationReached

    如果您认为这是库的问题,我建议您在此处提交问题:https://issuetracker.google.com/issues/new?component=413106&template=1096385 并附上重现,我很乐意查看!

    否则,如果您可以附上您的 PagingSource 实现,那将有所帮助,因为到目前为止您发布的内容没有太多信息。

    【讨论】:

    • PagingSource 似乎工作正常,我在问题中添加了指向 Kotlin 代码的链接,源位于 app/src/main/java/au/com/dw/paging3contentprovider/rx/ MessageRxPageSource.kt。 Java 版本只是一个端口,要点如下:gist.github.com/davidwong/4196b1c92d20e479eda56f0445683b61
    • 在 java 变体中,您为 itemsBefore 和 itemsAfter 传递 0,但在构造 LoadResult.Page 时使用 kotlin 中的默认值 COUNT_UNDEFINED。
    • 我尝试将这些参数更改为 LoadResult.Page.COUNT_UNDEFINED,但仍然无法正常工作。感谢您的回答,但我将其保留到第 3 页通过 alpha 阶段后再试。或者直到我能找到一些在 java 中分页 3 的工作示例。
    【解决方案2】:

    事实证明,使用 RxJava 的 Paging 3.0 在活动中使用时确实可以正常工作。我有这个问题,因为我在一个片段中有recyclerview、适配器等。不知道为什么会这样,可能是由于生命周期的差异?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多