Firestore
在关闭应用程序(被系统杀死或被用户删除)时似乎没有执行挂起的写操作。当应用程序脱机时排队的每个写入操作仅在应用程序在线并再次运行时才执行。
我想在后台手动执行这些写操作,所以我使用的是Work Mananger
,其中包括以下代码行:
FirebaseFirestore.getInstance().enableNetwork();
完整代码段:
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()
旨在在禁用网络访问后重新启用它。我的应用程序从不禁用它,我只是用它来执行挂起的写操作。
这是实现我想要的好方法吗?有更好的方法吗?
答案 0 :(得分:1)
enableNetwork()
是一种非常聪明的方法。并非打算用于此用途,但可以使用。
enableNetwork()
被设计为幂等的。您可以根据需要多次调用它,如果已经启用了网络,则它什么也不做。 (disableNetwork()
具有相同的行为。)
此方法起作用的另一部分是Firestore直到您对其进行处理后才开始其内部工作队列。我们这样做的原因有很多,但主要是为了允许您在执行任何操作之前先致电setFirestoreSettings()
。
您的解决方案之所以有效,是因为enableNetwork()
是触发此内部启动的调用,但是由于已经启用了网络,最终它什么也不做。
请注意,如果没有任何操作,Firestore实际上不会创建网络连接,因此在您执行操作时启动它相对便宜,并且如果无事可做,它将检查挂起的写入什么也不做。
如果有一个API可以知道我们是否已完成同步待处理的写入,则可以对此进行改进。我们已经提出了这个想法,但是还没有解决我们想要的API,也没有将其优先于其他工作。如果这对您来说非常重要,请注意,该资源已在https://github.com/firebase/firebase-android-sdk/处打开,我们非常友好:-)。