我已经像这样设置了一些侦听器:
deviceListener = db.addSnapshotListener(this::handleDbChange)
当我具有稳定的Internet连接时,处理程序将在数据更改时触发并允许我更新我的应用程序。但是,当我丢失并重新建立Internet连接后,处理程序将停止开火。这种情况并非总是在第一次断开连接时发生,但总是在连接断开2或3次后发生。
我尝试删除监听器,并在网络发生变化时重新添加它们。此外,我尝试在重新建立网络连接后直接获取数据:
db.get().add().addOnCompleteListener {
val snapshot = it.result
snapshot.toObject(Model::class.java)
}
但是,这仍然可以处理过时的数据。我发现解决此问题的唯一方法是重新启动应用程序。
如果其他任何人都遇到过此问题,您可能对如何解决它有任何见解,我们将不胜感激。仅供参考,我正在使用com.google.firebase:firebase-firestore:17.0.2
版的库。
答案 0 :(得分:1)
我知道它的回复很晚,我只是这里的新手(所以我可能是错的),但是对于其他任何人来说,...可能是我遇到的问题的组合:
Firebase Firestore batch command wont commit after regaining connection
还有其他人遇到的问题:
Firestore doesn't immediately start listening to changes when Internet Connection Resumes
摘要:
确保在没有仿真器的情况下进行测试。
如果需要实时数据,请关闭数据持久性。
而且,在重新获得连接后,Firestore可能会使用不可控制的计时器来指示何时重新连接其侦听器。
答案 1 :(得分:0)
使用设备代替模拟器,如NicCoe所述。我也长期遭受类似问题的困扰,最终发现Firestore在设备和仿真器上的工作方式有所不同。 (仅供参考,我使用的是com.google.firebase:firebase-firestore:17.1.3
。)在使用设备更改测试环境后,大多数问题已解决。我发现的设备的一个小问题是Firestore重新获得Internet连接后多次给出空结果。我用以下代码解决了这个问题:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
...
mRetryButton.setOnClickListener {
val pendingIntent = PendingIntent.getActivity(context, 0, Intent(context, ThisActivity::class.java), PendingIntent.FLAG_ONE_SHOT)
val alarmManager = context?.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent)
System.exit(0)
}
...
}
fun fetchData() {
FirebaseFirestore.getInstance().collection("col_name").get()
.addOnCompleteListener {
if (it.isSuccessful) {
val result = it.result!!
if (result.isEmpty && result.metadata.isFromCache) {
mRetryButton.visibility = View.VISIBLE
return@addOnCompleteListener
}
var docs = result.documents
...
} else {
Log.d(TAG, "Error getting documents: ", it.getException())
}
}
}