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()旨在禁用它后重新启用网络访问。我的应用程序从不禁用它,我只是用它来执行挂起的写入。
这是实现我想要的好方法吗?有一个更好的方法吗?
enableNetwork()是一个非常聪明的方法来做到这一点。它原本不打算用于此用途,但它确实有效。
原因是它enableNetwork()被设计为幂等的。您可以随心所欲地调用它,如果网络已经启用,它什么都不做。(disableNetwork()具有相同的行为。)
这样做的另一个原因是 Firestore 在您对其进行处理之前不会启动其内部工作队列。我们这样做的原因有很多,但主要是为了让您setFirestoreSettings()在我们做任何事情之前先打电话。
您的解决方案之所以有效,enableNetwork()是因为调用会触发此内部启动,但最终不会执行任何操作,因为网络已经启用。
请注意,如果 Firestore 无事可做,它实际上不会创建网络连接,因此在您执行操作时启动它相对便宜,如果无事可做,它会检查挂起的写入并且什么都不做.
如果有一个 API 能够知道我们是否已完成同步挂起的写入,您可以对此进行改进。我们已经提出了这个想法,但还没有确定我们想要的 API,也无法将其与其他工作进行优先级排序。如果这对您很重要,请注意源代码已在https://github.com/firebase/firebase-android-sdk/上开放,我们非常友好:-)。
2020 年 6 月 12 日更新:我们添加了waitForPendingWrites,让您可以等到待处理的写入完成。
| 归档时间: |
|
| 查看次数: |
785 次 |
| 最近记录: |