我刚刚开始使用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()
}
}
})
此代码有什么问题?
答案 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)
}
}
})