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



我正在调查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中,这样我的用户体验会更有响应性,或者说每检索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(有效(将返回LiveData<T!>:

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

最新更新