如何在无网络时取消Firestore写入操作,避免网络恢复后自动执行
Firestore仅在线写入、离线直接取消的实现方案
你当前使用的普通set()方法会默认走Firestore的离线持久化队列,离线时写入任务会被缓存,网络恢复后自动同步,要实现你要的逻辑,可以选择以下两种方案:
方案1:全局关闭离线持久化(适合全业务无离线缓存需求)
初始化Firestore时直接禁用持久化,所有写入操作离线时会直接失败,不会生成缓存任务:
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder() .setPersistenceEnabled(false) .build(); firebaseFirestore.setFirestoreSettings(settings);
禁用后直接用你原来的写入代码即可,无网络时写入会直接触发失败回调,不会残留待同步任务。
方案2:仅单次写入不使用离线缓存(推荐,不影响其他业务的离线能力)
如果其他业务还需要用到Firestore的离线缓存功能,只需要给当前写入逻辑加两层校验即可:
- 先判断设备网络状态,无网络直接终止后续操作
- 用Firestore事务执行写入,事务本身仅支持在线运行,即便执行过程中断网,也不会生成缓存同步任务
代码示例
网络状态判断辅助方法
private boolean isNetworkAvailable(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); }
写入逻辑
// 无网络直接结束,不执行任何写入 if (!isNetworkAvailable(context)) { return; } // 事务执行写入,保证仅在线生效 firebaseFirestore.runTransaction(transaction -> { DocumentReference docRef = firebaseFirestore.collection("Test").document("test123"); transaction.set(docRef, hashMap); return null; }).addOnSuccessListener(aVoid -> { // 写入成功后的业务逻辑 }).addOnFailureListener(e -> { // 写入失败后的业务逻辑 });
注意事项
- 即便跳过网络状态判断,直接用事务执行写入,离线时也会立即返回失败,不会生成待同步的写入任务
- 不要直接使用普通的
set()/update()/delete()方法,开启持久化时这些方法的离线写入会被加入同步队列
内容的提问来源于stack exchange,提问作者Taha Sami
相关产品推荐
相关产品推荐

