RxJava - 每秒发出一个可观察对象

15

我正在使用RxJava在Android中制作一个计时器。我需要使用RxJava制作一个计时器,每秒钟发出一个observable。我尝试了以下方法,但都没有成功。你认为我做错了什么吗?

Observable.interval(1000L, TimeUnit.MILLISECONDS)
          .timeInterval()
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe({Log.d(LOG_TAG, "&&&& on timer") })
3个回答

34

你的代码似乎没有被调用。检查它是否被执行以及何时执行。在使用 Observable 时,完全正确。

例如,我将你的片段放在我的 MainActivityonCreate(...) 中:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Observable.interval(1000L, TimeUnit.MILLISECONDS)
            .timeInterval()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe { Log.d("tag", "&&&& on timer") }
    // ...
}

它有效:

https://www.dropbox.com/s/jxkm5ol8l5idyji/observable_interval.png?dl=0

此外,也许您不需要 .timeInterval(),因为Observable.interval(...)本身会以指定速率发出连续的数字,并且.timeInterval()只是将其转换为发出的时间间隔。


我不需要 .timeInterval() :) 我已经将其删除了,但仍然无法工作 :/ - fergdev
当我使用这个时,我得到一个lint错误:缺少可处理的对象。 - Karan Sharma
2
@KaranSharma,你可以使用可处理的方式来包装它,就像这样写:disposable = Observable.interval().... 然后在 Activity 的 onDestroy 中使用 disposable.dispose() - kukroid

1
在你的subscribe()中,你没有使用timeInterval()操作符返回的longTimeInterval对象。
正确版本:
.subscribe(longTimeInterval -> {
     Log.d(LOG_TAG, "&&&& on timer"); 
}

我认为你根本不需要使用 timeInterval() 操作符。在你的情况下,Observable.interval() 将每秒发出一个可观察对象,这可能是你想要的。而 timeInterval() 则将其转换为一个可观察对象,其中包含两个事件之间的确切时间差异,我怀疑你不需要这个。

3
Kotlin在单个参数的情况下不需要声明lambda参数,所以这不是问题。.subscribe { Log.d(...) } 是Kotlin中RxJava的正确用法。 - hotkey
好的,谢谢你指出来!得赶快学学 Kotlin :) - Vesko

1
在 Kotlin 和 RxJava 2.0.2 中,只需定义一个初始延迟为 0,周期为 1 的 Observable Interval,每秒就会发出一个列表项。请保留 HTML 标签。
val list = IntRange(0, 9).toList()
val disposable = Observable
    .interval(0,1, TimeUnit.SECONDS)
    .map { i -> list[i.toInt()] }
    .take(list.size.toLong())
    .subscribe {
       println("item: $it")
    }
Thread.sleep(11000)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接