Повторная попытка библиотеки подкачки Android loadRange() или loadAfter()
Я пытаюсь реализовать новую библиотеку подкачки из компонентов архитектуры 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>());
}
}
...
}
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);
}
}
Надеюсь, это поможет вам решить проблему