如何在 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)
我正在调查 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)