gpt4 book ai didi

Android Rx 去抖运算符

转载 作者:行者123 更新时间:2023-11-29 23:25:31 25 4
gpt4 key购买 nike

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

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

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

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 只发出一个项目,去抖动不会有任何影响。

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

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

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

关于Android Rx 去抖运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53653297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com