Firestore在丢失并重新获得互联网连接后停止更新

时间:2018-07-09 08:46:08

标签: firebase kotlin google-cloud-firestore

我已经像这样设置了一些侦听器:

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版的库。

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())
                }
            }
}