【问题标题】:Perform the Pending Writes When the App is Closed关闭应用程序时执行挂起的写入
【发布时间】:2019-04-26 09:13:34
【问题描述】:

Firestore 在应用程序关闭(被系统杀死或被用户删除)时似乎不会执行挂起的写入操作。应用程序离线时排队的每个写入都将仅在应用程序在线并再次运行时执行。

我想在后台手动执行这些写入,所以我使用了 Work Mananger,其中包含以下代码行:

FirebaseFirestore.getInstance().enableNetwork();

完整的 sn-p:

public class FirebaseSyncWorker extends Worker {

    public FirebaseSyncWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {

        FirebaseFirestore.getInstance().enableNetwork();

        return Result.success();
    }
}

此代码适用于我。它会在应用关闭时不时同步用户的数据。但是,我不确定这是否是正确的方法。

据我所知,enableNetwork() 旨在禁用网络访问后重新启用它。我的应用从不禁用它,我只是用它来执行挂起的写入操作。

这是实现我想要的好方法吗?有没有更好的方法来做到这一点?

【问题讨论】:

  • 所以你基本上想在应用被系统杀死或被用户删除时做一些事情,对吧?
  • @AlexMamo 确实如此。我特别想做的事情是执行所有等待的 Firestore 任务。
  • 所以为了更好地理解,您有多个Task 对象,您想等待每个对象都完成吗?
  • 目前没有 API 可以确定客户端 SDK 是否认为其所有待处理的写入都与服务器完全同步。不过,您可以为此提出功能请求。如果您有数据要从服务器同步,则需要对该数据进行查询并等待它完成。
  • @AlexMamo 不,我已经编辑了我的问题。我想对服务器执行所有挂起的写入操作。

标签: android firebase google-cloud-firestore


【解决方案1】:

enableNetwork() 是一个非常聪明的方法。它不是为此用途而设计的,但它确实有效。

原因是enableNetwork() 被设计为幂等的。您可以根据需要随时调用它,如果网络已经启用,它什么也不做。 (disableNetwork() 具有相同的行为。)

另一个原因是 Firestore 不会启动其内部工作队列,直到您对其进行操作。我们这样做的原因有很多,但主要是为了让您在我们做任何事情之前致电setFirestoreSettings()

您的解决方案有效,因为enableNetwork() 是触发此内部启动的调用,但由于网络已启用,因此最终不会执行任何操作。

请注意,如果 Firestore 无事可做,它实际上不会创建网络连接,因此在您正在做的时候启动它相对便宜,如果无事可做,它会检查待处理的写入什么都不做。

如果有一个 API 能够知道我们是否已完成同步待处理的写入,您可以改进这一点。我们已经提出了这个想法,但还没有确定我们想要的 API,也无法将其优先于其他工作。如果这对您很重要,请注意源代码已在 https://github.com/firebase/firebase-android-sdk/ 开放,我们非常友好:-)。

2020 年 6 月 12 日更新:我们添加了 waitForPendingWrites,让您可以等到挂起的写入完成。

【讨论】:

    猜你喜欢
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多