Повторная попытка библиотеки подкачки 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);
    }
}

Надеюсь, это поможет вам решить проблему

Другие вопросы по тегам