【发布时间】:2019-02-13 12:48:47
【问题描述】:
我尝试使用 Firestore 作为我的后端来实现新的 Android 分页库。我创建了一个扩展PageKeyedDataSource<Integer, MyObject> 的类MyDataSource,我在其中实现了三个功能:
- loadInitial
- 加载之前
- 加载后
例如其中一个功能是这样的:
@Override
public void loadInitial(@NonNull LoadInitialParams<Integer> params, @NonNull final LoadInitialCallback<Integer, MyObject> callback) {
query.addSnapshotListener((snapshots, exception) -> {
if (exception != null) return;
List<MyObject> list = new ArrayList<>();
for(DocumentSnapshot document : snapshots.getDocuments()){
list.add(document.toObject(MyObject.class));
}
callback.onResult(list, null, 1); //Error
});
}
一切正常,直到数据库中的某些内容发生更改、调用侦听器并且应用程序崩溃:
java.lang.IllegalStateException: callback.onResult 已调用,无法再次调用。
我尝试使用get(),效果很好。我要求获得实时更新。
如何避免这个错误?
【问题讨论】:
-
我认为不可能在分页的同时获得实时更新。正如错误消息所说,onResult 不能被第二次调用,这正是当您添加一个侦听器时发生的事情,该侦听器会随着查询的每次更改而被调用。
-
@DougStevenson 感谢您的回答。所以你基本上说 Firestore 不能实时使用新的 Android 分页库,对吧?当只分页数据而没有实时功能时,一切都很完美。
-
Firestore 可以很好地处理分页。您只是无法在使用分页库的同时获得实时更新。这是分页库的限制。
-
@DougStevenson 非常感谢您的澄清。这就是我一直在寻找的答案。请将其添加为答案,以便我接受。从字面上拯救了我的一天。
标签: android firebase google-cloud-firestore android-jetpack android-paging