Android 分页库 + Firestore 因 IllegalStateException 而崩溃
Android paging library + Firestore crashes with IllegalStateException
我正在尝试使用 Firestore 作为我的后端来实现新的 Android 分页库。我创建了一个扩展 PageKeyedDataSource<Integer, MyObject>
的 class MyDataSource
,我在其中实现了三个函数:
- loadInitial
- loadBefore
- loadAfter
例如其中一个函数是这样的:
@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 already called, cannot call again.
我尝试使用 get()
并且效果很好。我的要求是获得实时更新。
如何避免这个错误?
很遗憾,您不能同时进行实时更新和分页。你必须选择一个或另一个。这是分页库的一个限制,它需要在内部管理结果页面。
我正在尝试使用 Firestore 作为我的后端来实现新的 Android 分页库。我创建了一个扩展 PageKeyedDataSource<Integer, MyObject>
的 class MyDataSource
,我在其中实现了三个函数:
- loadInitial
- loadBefore
- loadAfter
例如其中一个函数是这样的:
@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 already called, cannot call again.
我尝试使用 get()
并且效果很好。我的要求是获得实时更新。
如何避免这个错误?
很遗憾,您不能同时进行实时更新和分页。你必须选择一个或另一个。这是分页库的一个限制,它需要在内部管理结果页面。