Android Rx 去抖运算符

Android Rx debounce operator

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

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

所以我发现 'debounce' 运算符是我正在寻找的,但在我的情况下它不起作用并且每次都会调用网络服务..

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()

         }
    }
})

这段代码有什么问题?

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

您的代码可能如下所示:

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

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

在监听器之外订阅主题(如果您计划在 activity 暂停时处理可观察对象,您可能希望在 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)
         }
    }
})