我仍然是RxJava的新秀,并尝试使用它来实现一些东西。
我的Android应用程序中有通知计数器,我希望每五分钟从API中获取一次计数,并且希望将此计数共享给多个活动。因此,我想将计数存储在管道中,以便每个活动侦听该管道都可以获取最后发出的值。
我从Object类开始,并添加了两个BehaviorSubjects
,一个用于提供默认值,第二个在5分钟结束时“告诉活动正在监听的活动”发出真实值,您应该获取新计数。
但是问题是,当我监听BehaviorSubject时,它会发出管道中的所有数据!我怎么只能得到最后一个
object RxBus {
@JvmStatic
var count: Int = 0
@JvmStatic
private var fetchData: Boolean = true
@JvmStatic
private var behaviorSubject: BehaviorSubject<Any> = BehaviorSubject.createDefault(CountEvent(count))
@JvmStatic
private var fetchSubject: BehaviorSubject<Any> = BehaviorSubject.createDefault(FetchEvent(fetchData))
private val FIVE_MINUTES: Long = 1000 * 60 * 5
init {
fixedRateTimer("countTimer", false, 0L, FIVE_MINUTES) {
fetchSubject.onNext(FetchEvent(true))
}
}
fun publish(event: Any) {
if (event is CountEvent) {
Log.d(TAG, "eventCount = ${event.count}")
count = event.count
fetchData = false
}
}
fun listenToLoadEvent(): Observable<FetchEvent> {
return fetchSubject.ofType(FetchEvent::class.java)
}
fun listen(): Observable<CountEvent> {
return behaviorSubject.ofType(CountEvent::class.java)
}
请注意,我想听每个活动的onResume
中的两个主题。是否有更好的方法?如果不能,您可以帮我只获取最后发出的物品。
预先感谢
答案 0 :(得分:0)
class CountEvent(val value: Int)
object CounterManager {
val counterDataSource = BehaviorProcessor.create<CountEvent>()
val refreshNotifier = interval(5, TimeUnit.MINUTES).publish()
.refCount()
fun publish(event: Any) {
if (event is CountEvent) {
counterDataSource.onNext(event)
}
}
}