任务:显示
ListView
- >中的用户列表首先向用户展示Database
(数据库为Room
)然后如果有API
的答案(使用@GET
Retrofit2
请求),则显示 获取数据。
我认为要实现此功能,我需要使用RxJava
的{{1}}方法。
所以在我的ConcatArray
我有获取数据的方法:
Activity
当Internet连接正常时,它正常工作,但它有一个我无法解决的错误; bug可以像这样重现:
- 使用Internet连接运行活动(应用程序)
- 关闭活动(应用程序)
- 不使用互联网运行活动(应用程序)
醇>
结果数据显示数据库没有显示,但它在那里,缓存,我认为这是因为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()
错误,它清除了从数据库获取的数据。
你能帮我吗?
答案 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());
}