观察者订阅我的可观察对象时如何返回默认值

时间:2018-09-20 09:23:56

标签: android android-studio kotlin rx-java2

我仍然是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中的两个主题。是否有更好的方法?如果不能,您可以帮我只获取最后发出的物品。

预先感谢

1 个答案:

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

    }