Альтернатива Android LiveData Observer в отношении производительности - PullRequest
0 голосов
/ 23 октября 2019

В настоящее время я занимаюсь разработкой приложения, которое, помимо прочего, может регистрировать сенсоры смартфонов, такие как ускорение и т. Д., И отображать их с помощью библиотеки GraphView. В данный момент я считываю значение датчиков в базу данных Roomitecite, а затем с помощью наблюдателя, который наблюдает за таблицей с помощью объекта 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 реагирует на изменение LiveData, но это не кажется мне хорошим вариантом с точки зрения производительности. Кто-нибудь может иметь лучшую идею, как синхронизировать измерения в базе данных с серией GraphViews?

1 Ответ

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

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

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

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

...