Как транслировать результаты Realm в LiveData в приложении для Android

Я изучаю использование 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?


person Hector    schedule 02.08.2018    source источник


Ответы (1)


Я думаю, это может сработать для вас (kotlin) (вернет LiveData<T!>:

fun <T> Flowable<T>.toLiveData() = LiveDataReactiveStreams.fromPublisher(this)
person Krzysztof Kubicki    schedule 02.08.2018
comment
моим издателем будет List ‹DataItemUI›; как создать издателя с постоянно обновляемым Списком ‹›? - person Hector; 02.08.2018
comment
разве ваш издатель не может быть toFlowable()-ed? - person Krzysztof Kubicki; 03.08.2018