如何在 Android 应用程序中将 Realm 结果流式传输到 LiveData

How to stream Realm Results to LiveData in Android Application

我正在调查 LiveData 在我当前的 Android 应用程序中的使用。

我的应用程序的主屏幕显示了从我的本地 Realm 数据库中检索到的数据项列表。

目前我正在从 Realm 中检索所有行,然后我 post 将整个列表添加到我的 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);

我想做的是 post 我的 LiveData 的每一行,以便我的 UX 响应更快,或者说 post 每 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 获取新行时,我如何才能获得预期的结果来刷新显示的列表?

我认为这对你有用 (kotlin)(will return LiveData<T!>:

fun <T> Flowable<T>.toLiveData() = LiveDataReactiveStreams.fromPublisher(this)