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

时间:2018-02-27 12:24:46

标签: android rx-java retrofit2 android-room

  

任务:显示ListView - >中的用户列表首先向用户展示   Database(数据库为Room)然后如果有API的答案(使用@GET Retrofit2请求),则显示   获取数据。

我认为要实现此功能,我需要使用RxJava的{​​{1}}方法。

所以在我的ConcatArray我有获取数据的方法:

Activity

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

  
      
  1. 使用Internet连接运行活动(应用程序)
  2.   
  3. 关闭活动(应用程序)
  4.   
  5. 不使用互联网运行活动(应用程序)
  6.   

结果数据显示数据库没有显示,但它在那里,缓存,我认为这是因为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)); } ConcatArray出现getUsersFromApi()错误,它清除了从数据库获取的数据。

你能帮我吗?

2 个答案:

答案 0 :(得分:0)

在这种情况下,您总是从数据库和API获取数据。当您没有互联网连接时,您将收到例外。

您可以使用情侣解决方案。第一个是平面地图

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);

答案 1 :(得分:0)

没有Internet连接时会引发异常。您可以使用onErrorResumeNext运算符来返回缓存的数据。

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