Google Firestore调用.set()时网络断开未触发失败监听器问题
Firestore 写操作断网场景回调未触发问题说明与解决方案
Firestore 默认启用离线持久化机制,调用
add()、set()等写操作时,若处于断网状态,操作会先写入本地离线缓存,SDK 会在网络恢复后自动重试同步,不会立即判定为操作失败,因此不会触发OnFailureListener或OnCanceledListener。只有当服务端明确返回错误(如权限不足、数据格式非法)时,才会触发失败回调。
可选用的处理方案
方案1:判断操作结果是否来自本地缓存
可以在操作回调中通过isFromCache()方法判断是否仅同步到本地缓存、未提交到服务端,示例代码(Java)如下:db.collection("你的集合名称") .add(你的业务数据对象) .addOnSuccessListener(documentReference -> { // 指定仅从服务端获取最新文档快照 documentReference.get(Source.SERVER) .addOnCompleteListener(task -> { if (task.isSuccessful()) { if (task.getResult().isFromCache()) { // 操作仅写入本地缓存,当前网络不可用未同步到服务端,可在此添加自定义断网逻辑 } else { // 数据已成功同步到服务端 } } else { // 捕获服务端返回的操作错误 } }); }) .addOnFailureListener(e -> { // 仅服务端明确返回错误时触发该回调 });方案2:禁用离线持久化(仅适合无离线需求的场景)
如果业务不需要支持离线操作,可以在初始化Firestore时关闭离线持久化,此时断网状态下调用写操作会直接触发OnFailureListener,初始化代码示例:
注意:关闭持久化后所有读写操作都依赖网络,离线状态下所有操作会直接返回失败FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder() .setPersistenceEnabled(false) .build(); FirebaseFirestore.getInstance().setFirestoreSettings(settings);方案3:提前检测网络状态
调用写操作前先监听系统网络状态,如果已经处于断网状态,可直接给用户对应提示,不需要等待Firestore回调。
内容的提问来源于stack exchange,提问作者Konstantin Konopko
相关产品推荐
相关产品推荐

