Приемник вещания получает информацию только один раз - PullRequest
0 голосов
/ 04 июля 2018

У меня есть служба, которая отправляет две трансляции одновременно.

val i = Intent(PlayerService.INTENT_ACTION)
i.putExtra(EVENT_EXTRAS, PlayerEvent.PLAYER_READY.ordinal)
i.putExtra(DURATION_EXTRAS, mp.duration) //some duration
sendBroadcast(i)

val i1 = Intent(PlayerService.INTENT_ACTION)
i1.putExtra(EVENT_EXTRAS, PlayerEvent.ON_SECOND_CHANGED.ordinal)
i1.putExtra(DURATION_EXTRAS, player.duration) //another duration
sendBroadcast(i1)

Действие намерений такое же, но дополнения разные. Наконец, я получаю ответ только из второй передачи. Кто знает, в чем причина?

Данные моего приемника в реальном времени:

class PlayerLiveEvent(val context: Context) : LiveData<Intent>() {

override fun onActive() {
    super.onActive()
    context.registerReceiver(receiver, IntentFilter(PlayerService.INTENT_ACTION))
}

override fun onInactive() {
    super.onInactive()
    context.unregisterReceiver(receiver)
}

private val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        postValue(intent)
    }
  }
}

Фрагмент, где я наблюдаю эти события:

PlayerLiveEvent(activity!!).observe(this, Observer {
        it?.apply {
            val event = PlayerEvent.values()[getIntExtra(EVENT_EXTRAS, 0)]
            when (event) {
                PlayerEvent.PLAYER_READY -> {
                    println("PLAYER_READY")
                }
                PlayerEvent.ON_SECOND_CHANGED -> {
                    println("ON_SECOND_CHANGED")
                }
                else -> println()
            }
        }
    })

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Ваша вторая onReceive вызывается до того, как задача postValue из первой onReceive будет выполнена в главном потоке, и, следовательно, значение, установленное во второй раз, игнорируется. Это также видно из реализации postValue:

    ...
    synchronized (mDataLock) {
        // for your second call this will be false as there's a pending value
        postTask = mPendingData == NOT_SET;
        mPendingData = value;
    }
    // so this is true and so the method returns prematurely
    if (!postTask) {
        return;
    }
    ...

В связи с этим используйте setValue, поскольку оно устанавливает значение немедленно и вызывается из основного потока.

0 голосов
/ 04 июля 2018

Проблема в LiveData, события не передаются по мере необходимости.

Этот документ объясняет, почему postValue публикует сообщения только один раз. Вот почему решение будет следующим:

private val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        value = intent
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...