【问题标题】:Firestore stops updating after losing and regaining an internet connectionFirestore 在失去和重新获得互联网连接后停止更新
【发布时间】:2018-12-16 21:25:38
【问题描述】:

我已经设置了一些这样的监听器:

deviceListener = db.addSnapshotListener(this::handleDbChange)

当我有一个稳定的互联网连接时,处理程序会在数据更改时触发并允许我更新我的应用程序。但是,当我失去并重新获得互联网连接时,处理程序将停止触发。这并不总是在第一次断开连接时发生,但它总是在我的连接断开 2 或 3 次后发生。

我已尝试删除侦听器并在网络更改时重新添加它们。此外,我尝试在重新建立网络连接后直接获取数据:

db.get().add().addOnCompleteListener {
   val snapshot = it.result
   snapshot.toObject(Model::class.java)
}

但是,这仍然服务于陈旧的数据。我发现解决此问题的唯一方法是重新启动应用程序。

如果其他人遇到过这个问题,我会很感激您对如何解决它有任何见解。仅供参考,我正在使用库的 com.google.firebase:firebase-firestore:17.0.2 版本。

【问题讨论】:

  • 我也遇到过类似的问题。重新连接后我得到了数据更新,但我无法更新或创建任何新数据。

标签: firebase kotlin google-cloud-firestore


【解决方案1】:

我知道这是一个迟到的答复,而且我只是这里的新手(所以我可能是错的),但是对于其他任何人来说...这可能是我遇到的问题的组合:

Firebase Firestore batch command wont commit after regaining connection

还有其他人遇到的问题:

Firestore doesn't immediately start listening to changes when Internet Connection Resumes


总结:
确保您在没有模拟器的情况下进行测试。
如果您需要实时数据,请关闭数据持久性。
Firestore 可能会使用一个无法控制的计时器来指示在重新连接后重新连接其侦听器的时间。

【讨论】:

  • 您能澄清一下您是指 Android Emulator 还是 Firebase Emulator?
【解决方案2】:

使用设备而不是模拟器,正如NicCoe 所提到的。我也长期遇到类似的问题,最后发现 Firestore 在设备和模拟器上的工作方式不同。 (仅供参考,我使用的是com.google.firebase:firebase-firestore:17.1.3)在使用设备更改测试环境后,大多数问题都得到了解决。我发现的设备的一个小问题是,Firestore 在重新连接互联网后多次给出空结果。我用这段代码解决了它:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多