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)
}
}
})
我刚开始使用 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)
}
}
})