Android: пропуск данных в реальном времени - PullRequest
0 голосов
/ 14 октября 2019

Я использую Live Data для публикации состояний из модели представления в фрагменты, это может привести к частой публикации состояний. Но Mutable Live Data пропускает начальные значения и принимает последние доступные значения.

Существует статья , в которой говорится об этой характеристике, но есть ли способ обработки этого случая, такой как Текучий в RxJava или настройка Обратное давлениеСтратегия или мне нужно вернуться к использованию RxJava и управлять публикацией на основе жизненного цикла?

Ниже приведен пример кода, демонстрирующий это поведение. Значения от 1 до 10 публикуются, но принимаются только два значения, 0 и 10. Можем ли мы изменить это поведение в реальных данных или мне следует использовать RxJava для этой цели?

Фрагмент (подписчик):

class ParentFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel = ViewModelProviders.of(
            this, ParentViewModelFactory(this, null)
        ).get(ParentViewModel::class.java)

        viewModel.fastLiveData.observe(this, Observer {
            Timber.i(it.toString())
        })

        viewModel.startPublishing()
    }
}

Просмотр модели (издателя):

class ParentViewModel(private val savedState : SavedStateHandle)
    : ViewModel<ParentState>() {

    val fastLiveData : MutableLiveData<Int> = MutableLiveData(0)

    fun startPublishing() {
        for(x in 1..10) {
            Timber.i(x.toString())
            fastLiveData.postValue(x)
        }
    }
}

Вывод:

(ParentViewModel.kt:30)#startPublishing: 1
(ParentViewModel.kt:30)#startPublishing: 2
(ParentViewModel.kt:30)#startPublishing: 3
(ParentViewModel.kt:30)#startPublishing: 4
(ParentViewModel.kt:30)#startPublishing: 5
(ParentViewModel.kt:30)#startPublishing: 6
(ParentViewModel.kt:30)#startPublishing: 7
(ParentViewModel.kt:30)#startPublishing: 8
(ParentViewModel.kt:30)#startPublishing: 9
(ParentViewModel.kt:30)#startPublishing: 10
(ParentFragment.kt:57)#onChanged: 0
(ParentFragment.kt:57)#onChanged: 10

1 Ответ

0 голосов
/ 15 октября 2019

Используйте RxJava. LiveData предназначено для наблюдения в слое вида основным потоком. LiveData наблюдателям не имеет смысла потреблять больше, чем частота обновления экрана или человеческий глаз может с этим справиться.

Использование RxJava и LiveData в одном проекте является законным выбором дизайна. В Интернете должно быть несколько статей и примеров кода, вот что я только что нашел: https://proandroiddev.com/mvvm-architecture-using-livedata-rxjava-and-new-dagger-android-injection-639837b1eb6c

...