我在我的应用程序中使用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] 删除。
我来说两句