You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:24:02