Firestore离线写入数据时的警告

马拉特

我在我的应用程序中使用Firestore。根据文档,它支持脱机数据持久性,并且当网络再次打开时,Firestore会同步更改。

这是我的代码。

FirebaseFirestore db = FirebaseFirestore.getInstance();
User user = new User();
db.collection("users").document("doc").set(user);

它按预期方式工作:如果网络关闭,则在本地缓存,并在网络再次打开时进行同步。但是我不断收到这个警告:

W/ManagedChannelImpl: [{0}] Failed to resolve name. status={1}

这篇文章说这是由于没有互联网连接。如果Firestore支持离线持久性,为什么会收到此警告?如何摆脱这个警告?

亚历克斯·莫莫

它按预期方式工作:如果网络关闭,则在本地兑现;当网络再次打开时,则进行同步。

那是预期的行为。

但是我不断收到这个警告:

W/ManagedChannelImpl: [{0}] Failed to resolve name. status={1}

这篇文章说这是由于没有互联网连接。

帖子正确,是因为没有互联网连接。

如果Firestore支持离线持久性,为什么会收到此警告?

之所以能够得到它,是因为在您重新连接Internet的时间与侦听器实际上变为活动的时间之间,有一段很长的时间未将客户端连接到服务器。这就是为什么除非网络打开并且客户端再次与服务器同步,否则警告会多次打印而不会停止的原因。

重试未如您期望的那样快进行的原因是,执行重试的代码正在使用所谓的指数补偿算法。这意味着该代码可防止在用户设备上如此迅速地进行所有重试,从而提高了性能。重试次数过多也会消耗大量数据计划带宽,从而影响用户。

当您正在侦听Cloud Firestore数据库中的更改并且网络断开连接时,这种情况正在发生,不幸的是您无能为力。您对Firebase Firestore SDK如何管理其连接没有任何控制。

如何摆脱这个警告?

IMO,由于它只是警告而不是Exception,并且仅显示几秒钟,直到重新建立连接为止,因此您可以简单地忽略它。

但是,如果您真的想摆脱它,下面的代码可能会对您有所帮助。请注意,我尚未测试。

InstantiatingGrpcChannelProvider channelProvider = InstantiatingGrpcChannelProvider.newBuilder()
    .setKeepAliveTime(Duration.ofSeconds(60L))
    .setKeepAliveTimeout(Duration.ofMinutes(5L))
    .build();

FirestoreOptions firestoreOptions = FirestoreOptions.newBuilder()
    .setChannelProvider(channelProvider).build();

FirebaseOptions firebaseOptions = new FirebaseOptions.Builder()
    .setCredentials(credentials).setFirestoreOptions(firestoreOptions)
    .setConnectTimeout(5000).setReadTimeout(5000).build();
FirebaseApp firebaseApp = FirebaseApp.initializeApp(firebaseOptions);

Firestore firestore = FirestoreClient.getFirestore(firebaseApp);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章