Android分页库重试loadRange()或loadAfter()

时间:2018-05-23 12:18:30

标签: android android-architecture-components android-paging

我正在尝试从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 个答案:

答案 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);
    }
}

希望能帮到你解决问题