Альтернатива Android LiveData Observer по производительности

В настоящее время я разрабатываю приложение, которое, помимо прочего, может записывать датчики смартфонов, такие как ускорение и т. Д., И строить их с помощью библиотеки GraphView. На данный момент я считываю значения датчиков в базу данных SQLite комнаты, а затем с помощью наблюдателя, который наблюдает за таблицей с помощью объекта LiveData, я получаю новые измерения и добавляю последнее новое измерение к серии на графике. Вот как я обновляю график:

sharedViewModel.allAccelerations.observe(viewLifecycleOwner, Observer<List<MeasurementDatabaseHelper.Measurement>> { measurements ->
    if (sharedViewModel.isReset.value == true && measurements.isNotEmpty()) {
        val time = (measurements.last().time.toDouble() - measurements.first().time.toDouble())*1e-9
        val accX = measurements.last().accX.toDouble()
        series.appendData(DataPoint(time, accX), true, 50)

    }

Однако моя проблема в том, что Observer не реагирует на каждое добавленное измерение, поэтому я пропускаю значения, когда добавляю последнее измерение в серию. Конечно, я мог бы написать код, который проверяет, сколько значений нужно добавлять каждый раз, когда Observer реагирует на изменение LiveData, но это не кажется мне хорошим вариантом с точки зрения производительности. Кто-нибудь может лучше понять, как синхронизировать измерения в базе данных с серией GraphViews?


person P. Leibner    schedule 23.10.2019    source источник
comment
Я бы обновил график непосредственно во время работы приложения, не обходя Room, и использовал бы базу данных только для инициализации графика при перезапуске приложения.   -  person Enselic    schedule 23.10.2019


Ответы (1)


LiveData не поток. Он предназначен для представления самодостаточного государства; его не следует использовать для серии независимых событий, на которых вы строите свое государство. Когда вы используете его по назначению, вам не следует беспокоиться о пропуске состояний, поскольку вас волнует только текущее состояние.

Кажется, вы преследуете реактивный поток. Если вы используете Room, вы можете попробовать RxJava и представить свои события измерений в виде Flowable потока. Это даст вам полный контроль над противодавлением (вы можете четко указать, хотите ли вы пропускать события или буферизовать их и т. Д.). В комнате есть встроенная поддержка для Rx-наблюдаемые запросы.

Другой подход - использовать LiveData, который всегда дает полный набор данных, но я не уверен, что это удовлетворит ваши ограничения.

person SqueezyMo    schedule 23.10.2019
comment
Спасибо за ваш вклад, который окончательно проясняет некоторые вещи! Я посмотрю на RxJava! - person P. Leibner; 24.10.2019