gpt4 book ai didi

android - 使用 Room 和 Firebase 链接多个 RxJava2 操作

转载 作者:行者123 更新时间:2023-11-29 16:51:36 26 4
gpt4 key购买 nike

一些背景:我是 RxJava 的新手,我正在尝试在应用程序中创建一个功能,该功能可以离线工作并在有网络时同步。我正在尝试链接多个操作,但我不太精通如何将 Completable、Maybe 和 Observable 等不同类型链接在一起。

以下是用户添加或更新一些数据后需要按顺序完成的操作列表:

  1. 在本地数据库上更新数据,只需将状态设置为syncing,在这里使用 Room。
  2. 将文件上传到 Firebase 存储。
  3. 获取文件 url 并将数据更新到 Firebase 数据库。
  4. 更新本地数据库的数据,设置状态为已同步

以下是每个操作的方法:

更新本地数据库:

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 之后的所有操作都不会被调用。

我也尝试过将 maybe 转换为可完成的,并使用 Completable.andThen 将它们链接起来,但我不确定如何正确地做到这一点,我需要返回的 fileUrl 来更新 firebase数据库。

有人可以指出我应该在这里使用什么的正确方向吗?这是一个相当简单的任务,现在感觉很复杂,也许我的方法错得离谱。

谢谢,

最佳答案

我在你的代码中添加了一些注释:

setStatus(...) // completable => (onError|onComplete)?
.toObservable() // => will call (onError|onComplete)? (beacause of the nature of completable)
.map(o -> uploadFile()) // never call because no item is emitted (completable...)
.map(fileUrl -> updateFirebaseDatabase(fileUrl)) // never call too
.doOnNext(() -> setStatus(..) ) // set status to synced // never call too
.subscribe(..)

您必须将 Completable 更改为 Single 并返回类似 true 的内容。

关于android - 使用 Room 和 Firebase 链接多个 RxJava2 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46299011/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com