【问题标题】:How to return a default value when an Observer subscribes to my Observable观察者订阅我的 Observable 时如何返回默认值
【发布时间】:2019-02-24 13:32:04
【问题描述】:

我还是 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 中收听两个主题。有没有更好的方法来做到这一点?如果不能,你能帮我只得到最后一个发出的项目。

提前致谢

【问题讨论】:

  • BehaviorSubject 将发出最后一个值和所有下一个值,您的活动将收到订阅后的最后一个值和所有下一个事件。您必须在发布方法上发布关于 behaviorSubject 的新计数器...

标签: android android-studio kotlin rx-java2


【解决方案1】:
    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)
            }
        }

    }

【讨论】:

  • 问题是当我发布一些内容时,它会通过管道,当我收听 BehaviorProcessor 时,它会发出所有已发布的数据!我只想获取最新的.. 例如,当第三个五分钟过去时,它发出 3 次,因此 api 被连续调用 3 次!如何解决这个问题
  • 它将向所有活动的观察者发出 1 次,您必须在 onPause 方法上取消订阅 refreshNotifier 的流...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2019-11-12
  • 2016-02-20
  • 2019-02-07
  • 2015-04-03
  • 2021-05-12
相关资源
最近更新 更多