1

我刚刚开始使用 RxJava,我正在努力弄清楚如何以正确的方式使用 observables。

在下面我有一个寻呼机,我想在页面滚动时调用一个网络服务,以避免许多无用的调用。

所以我发现“去抖动”运算符是我正在寻找的,但在我的情况下它不起作用并且每次都会调用 Web 服务。

v.pager.addOnScrollListener(object : RecyclerView.OnScrollListener() {

    override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
        super.onScrollStateChanged(recyclerView, newState)
        if (newState == RecyclerView.SCROLL_STATE_IDLE) {

            val itemPosition : Int = layoutManager.findFirstCompletelyVisibleItemPosition();

            Observable.just(itemPosition).debounce(1500, TimeUnit.MILLISECONDS).map {
                  retrieveUserDetail(userList[itemPosition])
            }.observeOn(AndroidSchedulers.mainThread()).subscribe()

         }
    }
})

这段代码有什么问题?

4

1 回答 1

2

正如 Stack Diego 和 PPartisan 在评论中所解释的,您应该在侦听器之外创建可观察对象并订阅一次。由于每个 observable 只发射一个项目,所以 debounce 不会有任何影响。

您的代码可能看起来像这样:

将您的主题声明为成员变量。

val subject: PublishSubject<Int> = PublishSubject.create()

订阅侦听器之外的主题(如果您计划在活动暂停时处理可观察对象,您可能希望在 onResume 或 onStart 中执行此操作)

subject
    .debounce(1500, TimeUnit.MILLISECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe { retrieveUserDetail(userList[itemPosition]) }

然后在您的滚动侦听器中,在调用 onScrollStateChanged() 时发出一个新项目

v.pager.addOnScrollListener(object : RecyclerView.OnScrollListener() {

    override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
        super.onScrollStateChanged(recyclerView, newState)
        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
            val itemPosition : Int = layoutManager.findFirstCompletelyVisibleItemPosition()
            subject.onNext(itemPosition)
         }
    }
})
于 2018-12-07T05:15:24.217 回答