【问题标题】:Firebase Firestore: Is there a callback when there is no internet connection?Firebase Firestore:没有互联网连接时是否有回调?
【发布时间】:2020-03-08 00:28:33
【问题描述】:

我正在开发一个使用 Cloud Firestore 存储数据的 Android 应用。这就是我将数据设置到数据库的方式:

private fun setData() {
    val task = UploadDataTask()
    task.setOnUploadFinishedListener(object: UploadDataTask.OnUploadFinishedListener{
        override fun uploadFinished() {
            // Do something
        }

        override fun uploadFailed() {
            // Do something
        }
    })
}

private class UploadDataTask: AsyncTask<Void, Void, Void>() {

    private var onUploadFinishedListener: OnUploadFinishedListener? = null
    fun setOnUploadFinishedListener(listener: OnUploadFinishedListener) {
        onUploadFinishedListener = listener
    }

    override fun doInBackground(vararg params: Void?): Void? {
        val map = hashMapOf(
            UID to firebaseUser.uid
        )
        firebaseFirestore.collection(USERS)
            .document(firebaseUser.uid)
            .set(map)
            .addOnSuccessListener {
                if(onUploadFinishedListener != null)
                    onUploadFinishedListener!!.uploadFinished()
            }
            .addOnFailureListener {
                if(onUploadFinishedListener != null)
                    onUploadFinishedListener!!.uploadFailed()
            }
        return null
    }

    interface OnUploadFinishedListener {
        fun uploadFinished()
        fun uploadFailed()
    }
}

这很好用,但有一个例外。当我想将数据加载到 Firestore,但没有连接到 Internet 时,onSuccessListener 和 onFailureListener 都不会被调用。我知道这是因为只有在将数据写入 Firestore 时才会调用它们。但我不知道有任何其他方法可以检查是否存在连接。例如,当我想在数据成功写入 Firestore 之前显示进度对话框时,如果没有连接,它不会关闭。那我该如何检查呢?

【问题讨论】:

    标签: android firebase kotlin google-cloud-firestore


    【解决方案1】:

    第一件事。 Cloud Firestore 客户端已在后台线程中运行所有网络操作。这意味着所有操作都不会阻塞主线程。将其放在AsyncTask不会带来任何额外的好处。

    例如,当我想在数据成功写入 Firestore 之前显示进度对话框时,如果没有连接,它不会关闭。

    只需在调用setData() 方法后显示ProgressDialog 并在onSuccess() 中将其关闭。由于只有在 Firebase 服务器上成功写入数据时才会调用此方法,因此是使用它的正确位置。

    此外,如果您希望在读取数据时具有相同的行为,那么您应该使用isFromCache() 方法,就像我在以下帖子的回答中解释的那样:

    【讨论】:

    • 好的,但是当我没有互联网连接时,对话框仍然不会被关闭,因为不会调用onSuccess()
    • 是的,没错。当您重新连接互联网时,ProgressDialog 将在触发 onSuccess() 时关闭。这不是你想要的吗?
    • 不,我希望它被解雇,当我有互联网连接并且onSuccess()onFailure() 被调用,但如果没有互联网连接,我也希望它被解雇,而不是显示一条消息或其他内容以通知用户上传数据无效。
    • 如果你想在有互联网连接时被解雇,那么你应该在onSuccess()中调用dismiss()onFailure()中。 但是如果您在没有互联网连接时关闭ProgressDialog,那么当您重新连接时您将没有什么可关闭的,对吧?因为ProgressDialog 已经被解雇了。如果您想知道设备是否连接到互联网,请参阅Detect whether there is an Internet on Android。现在可以了吗?
    • 我有同样的问题,这个帖子没有回答这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多