Android Rx反跳运算符

时间:2018-12-06 14:12:16

标签: android android-viewpager rx-java2 debounce rx-kotlin2

我刚刚开始使用RxJava,我正在努力寻找如何正确使用可观察对象的方法。

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

因此,我发现我需要的是'debounce'运算符,但就我而言,它不起作用,并且每次都会调用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()

         }
    }
})

此代码有什么问题?

1 个答案:

答案 0 :(得分:1)

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

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

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

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