当应用程序关闭时执行挂起的写入

Tal*_*rda 7 android firebase google-cloud-firestore

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

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

FirebaseFirestore.getInstance().enableNetwork();
Run Code Online (Sandbox Code Playgroud)

完整片段:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码对我有用。当应用程序关闭时,它会偶尔同步用户的数据。但是,我不确定这是否是执行此操作的正确方法。

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

这是实现我想要的好方法吗?有一个更好的方法吗?

Gil*_*ert 5

enableNetwork()是一个非常聪明的方法来做到这一点。它原本不打算用于此用途,但它确实有效。

原因是它enableNetwork()被设计为幂等的。您可以随心所欲地调用它,如果网络已经启用,它什么都不做。(disableNetwork()具有相同的行为。)

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

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

请注意,如果 Firestore 无事可做,它实际上不会创建网络连接,因此在您执行操作时启动它相对便宜,如果无事可做,它会检查挂起的写入并且什么都不做.

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

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