当前位置: 首页 > 知识库问答 >
问题:

经常调用回调方法来将事件转发到可观察的?

南门野
2023-03-14

所以我在自定义滑块视图上有这个监听器。当用户滑动滑块时,视图调用“滑块已更改(整数百分比)”。当滑块更改时,我正在尝试进行网络调用,但我不想进行一百万次网络调用,因为该方法在滑动时经常被调用。如何使此侦听器回调为可观察量?我知道一旦它是可观察的,我就可以使用去抖动,并且仅在一定的时间间隔后更新。

我试着做了< code>Observable.create(),但是我在一个回调方法中,我不知道如何工作。我用的是Kotlin和RxJava2 btw。

override fun onSliderChanged(percent: Int)
{
    // Either here or in the presenter I want to make this 
    // callback reactive so I can debounce the callback
    presenter.onSliderChanged(percent)
}

共有1个答案

解修然
2023-03-14

从你的问题中看不出你是如何通过听众的,但有两种一般情况浮现在脑海中。选择一个与您的实现匹配的实现。

案例1:监听器作为接口传递

为此,我假设你也有一个类似的界面——

interface SliderChangedListener {
    fun onSliderChanged(percent: Int)
}

以及 Slider 类中的一个方法,该方法采用该侦听器的实例 -

fun setSlideListener(listener: SliderChangedListener) 

这是一种常见的Java模式。在静态编程语言中,删除接口并只传递一个函数变量会更容易,但是鉴于您在上面显示了覆盖,您的视图似乎来自Java。无论如何,关键是创建一个可观察的,并让它创建和设置调用onNext的侦听器。

Observable.create(Observable.OnSubscribe<Int> {
        subscriber ->
        slider.setSlideListener(object : SliderChangedListener {
            override fun onSliderChanged(percent: Int) {
                subscriber.onNext(percent)
            }
        })
    }).subscribe { /* respond to the slide */ }

案例2:您扩展了< code>Slider类并覆盖了侦听器

在这种情况下,我假设您的< code>Slider类中有一个侦听器方法,您可以用问题中的代码直接覆盖它。在这种情况下,我们可以使用< code>Subject在侦听器和订阅者之间进行调解。

val mySlider = object : Slider() {
        val sliderObservable: PublishSubject<Int> = PublishSubject.create()
        override fun onSliderChanged(percent: Int) {
            sliderObservable.onNext(percent)
        }
    }
mySlider.sliderObservable.subscribe({ /* do slider work */ })
 类似资料:
  • 我已经做javascript有一段时间了。然而,我对Angular 2还比较陌生,所以我对可观测的东西几乎一无所知。当我读到对可观测事物的描述时,它们听起来很像我已经知道的回调。当我问谷歌时,有回调和promise之间的比较,也有promise和可观察之间的比较。然而,我找不到回调和可观察之间的任何比较。 回调和可观察之间有什么区别?

  • 问题内容: 我使用侦听器作为回调来观察Android的异步操作,但是我认为用RxJava替换此侦听器可能很棒,我是使用此库的新手,但是我真的很喜欢它,并且我始终将其与Android项目一起使用。 这是我的重构代码: 一个简单的回调: 和“观察者”: 谢谢! 问题答案: 例如,您可以使用 Observable.fromCallable 来创建可观察数据。 然后使用您的数据 使用了rxjava 1.x

  • 在我正在工作的一个项目中,我使用了paginglibrary和Reverfit。这是我第一次这么做。 数据正常返回。但是我注意到我的viewmodel(更确切地说是我的LiveData)中的观察者在我的PageKeyedDataSource中的LoadIsitial回调之前被调用。这将使传递给适配器的列表为空。为什么在我回调之前调用Observer?

  • 问题内容: 给定汽车清单(),我可以这样做: 有没有办法我可以从一个到一个序列? 像没有参数的东西 问题答案: 您可以这样映射到: 请注意,flatMapping可能不会保留源可观察的顺序。如果订单对您很重要,请使用。

  • 我对Observables和RxJs是新手,我想对回报进行调整。如果第一个选择器返回某个值,我希望第二个选择器可以观察到。但是如果第一个选择器没有返回那个特定的值,我想返回false,而不是(false)。我已经走了这么远,但这返回了一个可观察的结果

  • 我将Ionic3与一个一起使用。我有下面的函数,出于某种原因,即使该函数只被调用一次,第三行也会被触发两次。 问题 这引起了一个问题,因为正在获取第二个订阅的值,并且第一个订阅丢失,不允许我取消订阅。 问题 如何创建一个只有一个订阅的