Android + RxJava-загрузка данных из БД и веб-сервиса
Я хочу использовать RxJava для загрузки данных из веб-службы (через Retrofit). У меня также есть кэш базы данных предыдущих результатов.
предположим, что у меня уже есть наблюдаемые для каждого из них:
Observable<List<MyModel>> networkObservable = retrofitService.getModels();
Observable<List<MyModel>> dbObservable = database.getModels();
Я хочу объединить эти 2 наблюдаемых в:
public class MyModelHelper {
public static Observable<List<MyModel>> getModels() {
// TODO: Help!
}
}
поведение, которое я хочу, заключается в том, чтобы подписчики получали результаты базы данных, как только они доступны, а затем результаты restService, когда они входят (предполагая, что извлечение из БД быстрее, чем выполнение сетевого вызова)
лучшее, что я мог придумать самостоятельно, это:
public class MyModelHelper {
public static Observable<List<MyModel>> getModels() {
List<MyModel> emptyList = new LinkedList<>();
// 'startWith' because combineLatest wont call back until all source observables emit something
Observable.combineLatest(dbObservable.startWith(emptyList),
networkObservable.startWith(emptyList),
new Func2<List<MyModel>, List<MyModel>, List<MyModel>>() {
@Override
public List<MyModel> call(List<MyModel> first, List<MyModel> second) {
return merge(first, second);
}
});
}
}
Это кажется мне немного избитым, и я чувствую, что для такого общего сценария должно быть лучшее решение.
было бы также неплохо, если бы в сети произошла ошибка, наблюдаемая, что результаты db все равно будут переданы. Я мог бы позвонить onErrorResumeNext()
и вернуть dbObservable сам, но я все равно хотел бы, чтобы подписчики были уведомлены, что ошибка произошло.
какие предложения?
1 ответов
использовать Observable.merge
напрямую. Он объединяет несколько наблюдаемых потоков в один, поэтому, если база данных излучает быстрее, вы получите ее первым.
public static Observable<List<MyModel>> getModels() {
return Observable.merge(dbObservable, networkObservable);
}