如何使用 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.
我认为要实现此功能我需要使用 RxJava
的 ConcatArray
方法。
所以在我的 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 连接正常时,但它有一个错误,我无法修复;错误可以这样重现:
- Run Activity (App) with the Internet connection
- Close Activity (App)
- Run Activity (App) without Internet
作为数据库中未显示的结果数据,但它在那里,被缓存了,我认为这是因为在 ConcatArray
中 getUsersFromApi()
中发生错误并且它清除了从数据库中获取的数据。
你能帮帮我吗?
您总是从数据库中获取数据,并且 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());
}
Task: Show list of users in the
ListView
-> at first show users fromDatabase
(DB isRoom
) and then if there are answer fromAPI
(@GET
request usingRetrofit2
) show fetched data.
我认为要实现此功能我需要使用 RxJava
的 ConcatArray
方法。
所以在我的 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 连接正常时,但它有一个错误,我无法修复;错误可以这样重现:
- Run Activity (App) with the Internet connection
- Close Activity (App)
- Run Activity (App) without Internet
作为数据库中未显示的结果数据,但它在那里,被缓存了,我认为这是因为在 ConcatArray
中 getUsersFromApi()
中发生错误并且它清除了从数据库中获取的数据。
你能帮帮我吗?
您总是从数据库中获取数据,并且 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());
}