Я создаю очень простое приложение для Android, используя mvvm и шаблон репозитория. Он извлекает данные из сети (используя retrofit2 / RxJava2), если приложение находится в сети и сохраняет в БД (используя комнату), и публикует данные для наблюдения. Если приложение находится в автономном режиме, приложение получает данные из БД и публикует данные для наблюдения. Из действия приложение обновляет текстовые представления после наблюдения из класса viewmodel.
Все работает очень хорошо, когда приложение имеет активное подключение к Интернету. Когда интернет недоступен, он не загружает данные из БД. И это проблема, с которой я сталкиваюсь без понятия.
Занятие
viewModel.loadHomeData();
viewModel.homeDataEntityResult().observe(this, this::updateTextViews);
private void updateTextViews(HomeDataEntity data) {
if (data != null) {
tv1.setText(data.todayDate);
tv2.setText(data.bnDate);
tv3.setText(data.location);
}
}
Класс представления модели
private RamadanRepository repository;
private DisposableObserver<HomeDataEntity> disposableObserver;
private MutableLiveData<HomeDataEntity> homeDataEntityResult = new MutableLiveData<>();
public LiveData<HomeDataEntity> homeDataEntityResult() {
return homeDataEntityResult;
}
public void loadHomeData() {
disposableObserver = new DisposableObserver<HomeDataEntity>() {
@Override
public void onNext(HomeDataEntity homeDataEntity) {
homeDataEntityResult.postValue(homeDataEntity);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
repository.getHomeData()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.debounce(400, MILLISECONDS)
.subscribe(disposableObserver);
}
Класс репозитория
public Observable<HomeDataEntity> getHomeData() {
boolean hasConnection = appUtils.isOnline();
Observable<HomeDataEntity> observableFromApi = null;
if (hasConnection) {
observableFromApi = getHomeDataFromApi();
}
Observable<HomeDataEntity> observableFromDb = getHomeDataFromDb();
if (hasConnection)
return Observable.concatArrayEager(observableFromApi, observableFromDb);
else return observableFromDb;
}
private Observable<HomeDataEntity> getHomeDataFromApi() {
return apiService.getDemoHomeData()
.map(HomeDataEntity::copyFromResponse)
.doOnNext(homeDataDao::saveData);
}
private Observable<HomeDataEntity> getHomeDataFromDb() {
return homeDataDao.getHomeData()
.toObservable()
.doOnNext(homeDataEntity -> {
Timber.d("db data %s", homeDataEntity.toString());
});
}
Когда приложение подключено к сети, оно также печатает вставленные данные roomDB после извлечения. Чего на самом деле не хватает, когда приложение находится в автономном режиме?