如何使用 RxJava 的 ConcatArray 首先从数据库显示用户,然后从 Webservice 显示用户

How to user RxJava's ConcatArray to show users at first from Database, and then from Webservice

Task: Show list of users in the ListView -> at first show users from Database (DB is Room) and then if there are answer from API (@GET request using Retrofit2) show fetched data.

我认为要实现此功能我需要使用 RxJavaConcatArray 方法。

所以在我的 Activity 中,我有获取数据的方法:

public Observable<List<User>> getUsers() {
    return Observable.concatArray(
        getUsersFromDB(),
        getUsersFromApi()
    );
}

private Observable<List<User>> getUsersFromDB() {
    return userDAO.getUsers().toObservable();
}

private Observable<List<User>> getUsersFromApi() {
    return api.getUsers()
        .doOnNext(users -> cacheUsers(users));
}

它工作正常,当 Internet 连接正常时,但它有一个错误,我无法修复;错误可以这样重现:

  1. Run Activity (App) with the Internet connection
  2. Close Activity (App)
  3. Run Activity (App) without Internet

作为数据库中未显示的结果数据,但它在那里,被缓存了,我认为这是因为在 ConcatArraygetUsersFromApi() 中发生错误并且它清除了从数据库中获取的数据。

你能帮帮我吗?

您总是从数据库中获取数据,并且 API 在此 case.When 您没有互联网连接,您收到了异常。

您可以使用两种解决方案。第一张是平面图

getUsersFromDB().flatMap(list -> {
        if (list.isEmpty()) {
            return getUsersFromApi();
        } else {
            return Observable.just(list);
        }
    }).subscribe(System.out::println);

或者第二个是concat + filter + first

Observable.concat(getUsersFromApi(), getUsersFromApi())
    .filter(list -> !list.isEmpty())
    .first(Collections.emptyList())
    .subscribe(System.out::println);

没有 Internet 连接时抛出异常。您可以使用 onErrorResumeNext 运算符来 return 缓存数据。

public Observable<List<User>> getUsers() {
    return Observable.concatArray(
        getUsersFromDB().take(1),
        getUsersFromApi()
    ).onErrorResumeNext(getUsersFromDB());
}