Как вернуть значение по умолчанию, когда Observer подписывается на мой Observable - PullRequest
0 голосов
/ 20 сентября 2018

Я все еще новичок в 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 голосов
/ 20 сентября 2018
    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)
            }
        }

    }
...