我刚开始使用RxJava,我正在努力弄清楚如何以正确的方式使用可观察性。
下面我有一个寻呼机,我想在页面滚动上呼叫一个网络服务,避免许多无用的呼叫。
所以我发现"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()
}
}
})
这个代码出了什么问题?
正如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)
}
}
})