Некоторая предыстория: я новичок в RxJava и пытаюсь сделать в приложении функцию, которая будет работать в автономном режиме и синхронизироваться при наличии сети. Я пытаюсь связать несколько операций, но я плохо разбираюсь в том, как связать вместе разные типы, такие как Completable, Maybe и Observable.
Вот список операций, которые необходимо выполнить в порядке после того, как пользователь добавил или обновил некоторые данные:
- Обновите данные в локальной базе данных, просто установите статус синхронизация, используя Room здесь.
- Загрузите файл в хранилище Firebase.
- Получите URL-адрес файла и обновите данные в базе данных Firebase.
- Обновите данные в локальной базе данных, установите статус синхронизировано.
Вот методы для каждой операции:
Обновить локальную базу данных:
private Completable setStatus(Entity entity, Entity.Status status){
entity.setStatus(status);
return Completable.fromAction(() -> localDataStore.updatePersonalPlace(personalPlaceEntity));
}
Загрузить файл в FirebaseStorage с помощью Rx2Firebase
RxFirebaseStorage.putBytes(storageRef, bytes); // returns a Maybe<TaskSnapshot>
Установить данные в базе данных firebase
RxFirebaseDatabase.setValue(dataRef, model); // returns a Completable
я пробовал
setStatus(...)
.toObservable()
.map(o -> uploadFile())
.map(fileUrl -> updateFirebaseDatabase(fileUrl))
.doOnNext(() -> setStatus(..) ) // set status to synced
.subscribe(() -> Timber.d("Data updated",
t -> setStatus(..)); // set status back to what it was on error
Но это не работает, и я думаю, что не совсем понимаю основы того, как связать эти операции в цепочку. Ни одна из операций после toObservable не вызывается.
Я также пытался преобразовать возможно в завершаемый и связать их с помощью Completable.andThen
, но я не уверен, как это сделать правильно, и мне нужно, чтобы fileUrl возвращался для обновления базы данных firebase.
Может ли кто-нибудь указать мне правильное направление относительно того, что я должен использовать здесь. Это довольно простая задача, которая сейчас кажется очень сложной, возможно, мой подход ужасно неверен.
Спасибо,
subscribe
? Вы обрабатываете ошибки? Возможно, какое-то действие должно быть в определенном потоке и вылетит. - person Kevin Robatel   schedule 19.09.2017