Я изучаю использование LiveData в моем текущем приложении для Android.
На главном экране моего приложения отображается список элементов данных, полученных из моей локальной базы данных Realm.
В настоящее время я извлекаю все строки из Realm, а затем отправляю весь список в свои LiveData. В настоящее время это занимает 5 секунд или больше.
final List<DataItemDO> dataItemDOs = DatabaseController.fetchShortlistedDataItems();
final List<DataItemUI> dataItemUIs = new ArrayList<>();
for (final DataItemDO dataItemDO : dataItemDOs) {
final DataItemUI dataItem = constructDataItemUI(dataItemDO);
dataItemUIs.add(dataItem);
}
DATA_ITEMS.postValue(dataItemUIs);
Что я хотел бы сделать, так это публиковать каждую строку в моих LiveData, чтобы мой UX был более отзывчивым, или, скажем, публиковать каждые 10 извлеченных строк.
final List<DataItemDO> dataItemDOs = DatabaseController.fetchShortlistedDataItems();
final List<DataItemUI> dataItemUIs = new ArrayList<>();
for (final DataItemDO dataItemDO : dataItemDOs) {
final DataItemUI dataItem = constructDataItemUI(dataItemDO);
dataItemUIs.add(dataItem);
DATA_ITEMS.postValue(dataItemUIs);
}
Когда я попробовал этот подход, я получил следующее исключение: -
08-02 09:02:52.503 22134-22134/sutd.android E/AndroidRuntime: FATAL EXCEPTION: main
Process: sutd.android, PID: 22134
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.next(ArrayList.java:860)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at java.lang.String.valueOf(String.java:2827)
at java.lang.StringBuilder.append(StringBuilder.java:132)
У меня такое ощущение, что решить эту проблему можно либо с помощью преобразования LiveData, либо с помощью LiveDataReactiveStreams.
Я считаю, что мне нужно создать Emitter> и испускать каждую строку, я не вижу, с чего начать.
Как я могу добиться желаемых результатов, чтобы отображаемый список обновлялся каждый раз, когда я извлекаю новую строку из Realm?