我正在尝试从android体系结构组件实现新的分页库。基本功能正常,但我需要为loadRange()
或loadAfter()
添加重试功能。如果发生网络错误或设备处于脱机状态,我需要重试这些。我已经尝试过dataSource.invalidate()
,它会抛弃整个数据源,这似乎是一种浪费。有没有办法做到这一点?
这是我的代码:
public class MyDataSource extends PositionalDataSource<Item> {
...
@Override
public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback<Item> callback) {
ArrayList<Item> items = executeCall(1, params.requestedLoadSize);
if (items != null) {
callback.onResult(items, 0, totalCount);
} else {
callback.onResult(new ArrayList<Item>(), 0);
}
}
@Override
public void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback<Item> callback) {
ArrayList<Item> items = executeCall(params.startPosition, params.loadSize);
if (items != null) {
callback.onResult(items);
} else {
callback.onResult(new ArrayList<Item>());
}
}
...
}
答案 0 :(得分:1)
文档说
<块引用>一个回调只能被调用一次,如果再次调用就会抛出。 对于采用回调来存储回调并稍后调用它的 DataSource 加载方法始终有效。这使数据源能够完全异步,并处理临时的、可恢复的错误状态(例如可以重试的网络错误)。
因此,这是您可以实施的方法
@Override
public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback<Item> callback) {
ArrayList<Item> items = executeCall(1, params.requestedLoadSize);
if (items != null) {
callback.onResult(items, 0, totalCount);
} else {
//callback.onResult(new ArrayList<Item>());
//instead of passing the result when error, just ignore it and pass the loading state to your UI to handle reload
yourLoadingState.post(LOADING.ERROR);
}
}
@Override
public void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback<Item> callback) {
ArrayList<Item> items = executeCall(params.startPosition, params.loadSize);
if (items != null) {
callback.onResult(items);
} else {
//callback.onResult(new ArrayList<Item>());
//instead of passing the result when error, just ignore it and pass the loading state to your UI to handle reload
yourLoadingState.post(LOADING.ERROR);
}
}
希望能帮到你解决问题