【发布时间】:2018-05-30 07:20:20
【问题描述】:
我将我的一个应用转换为新的 Firestore。我正在做一些事情,例如在单击按钮时保存文档,然后在 onSuccess 侦听器中转到不同的活动。
我还利用 Firestore 保存操作返回任务这一事实,使用 Tasks.whenAll 将任务组合在一起:
val allTasks = Tasks.whenAll(
createSupporter(supporter),,
setStreetLookup(makeStreetKey(supporter.street_name)),
updateCircleChartForUser(statusChange, createMode = true),
updateStatusCountForUser(statusChange))
allTasks.addOnSuccessListener(this@SignUpActivity, successListener)
allTasks.addOnFailureListener(this@SignUpActivity, onFailureListener)
最后,我从成功保存中获取文档 ID,并将其存储在首选项或本地数据库中以供以后使用(在 onSuccessListener 内)
这一切都很好。 直到网络连接中断。然后一切都崩溃了,因为任务永远不会完成,并且 onSuccess/onFailure/onComplete 侦听器永远不会被调用。所以应用程序只是挂起。
我正在通过在每次保存之前检查网络可用性来解决此问题,然后通过创建没有任何侦听器的任务来解决此问题。我还在使用 UUID 生成器在本地生成文档 ID。
顺便说一句,这不是该应用与旧版 Firebase 一起工作的方式。在这种情况下,离线时一切都运行良好,而且每当应用程序上线时,我看到文档会同步。
我对 Firestore 的解决方法似乎很糟糕。有没有人提出更好的解决方案?
查看相关Firestore database on insert/delete document callbacks not being invoked when there is no connection addOnCompleteListener not called offline with cloud firestore
【问题讨论】:
-
你试过超时吗?有几种实现方式,只需在经过一段时间(比如 3-5 秒)后执行取消操作。
-
Task api 不会直接让您取消任务。所以你必须以其他方式做到这一点。
-
需要注意的一点是,当您使用 Firestore 进行添加/更新时,它会立即在本地缓存中创建一条记录。然后它会在可能的情况下尝试与服务器同步。所以它几乎就像一个两阶段提交。但是一旦数据在本地缓存中,它似乎不会被回滚。侦听器正在等待服务器同步,但如果有办法让侦听器返回本地同步,那就更好了。
-
正如亚历克斯在他的回答中所说的“当网络连接丢失(用户设备上没有网络连接)时,不会触发 onSuccess() 和 onFailure()。”。这也一直是 Firebase 实时数据库中的行为:只有在服务器上提交的写入才被视为失败/成功,在此之前它们处于挂起状态。
-
@Frank Firebase 根本没有 onSuccess()/onFailure() 监听器。它是完全异步的,所以当应用程序启动/离线时可能会发生一些事情,我不必知道它。它只是工作。 Firestore 也声称是异步的,但实际上文档并不清楚这些差异。
标签: android firebase firebase-realtime-database google-cloud-firestore