2

我正在尝试从 android 架构组件中实现新的分页库。基本功能工作正常,但我需要为loadRange()or添加重试功能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>());
        }
    }

    ...
}
4

1 回答 1

1

文件说

回调只能调用一次,如果再次调用将抛出。对于接受回调来存储回调并稍后调用它的 DataSource 加载方法始终有效。这使 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);
    }
}

希望它可以帮助您解决问题

于 2021-04-17T08:40:34.417 回答