Firebase Firestore:在没有互联网连接时是否有回调?

4

我正在使用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中时,如果没有连接到因特网,既不会调用onSuccessListener也不会调用onFailureListener。我知道这是因为它们只会在数据写入Firestore时被调用。但我不知道任何其他检查是否连接的方法。例如,当我想显示进度对话框直到数据成功写入Firestore时,如果没有连接,它将不会消失。那么我该如何检查呢?
1个回答

2
首先要明确的是,Cloud Firestore客户端已经在后台线程中运行所有网络操作。这意味着所有操作都在不阻塞主线程的情况下进行。将其放入AsyncTask中并没有额外的好处。
引用一段话:“例如,当我想要在数据成功写入Firestore之前显示进度对话框时,如果没有连接,它就不会消失。”
只需在调用setData()方法时显示ProgressDialog,并在onSuccess()中取消显示。由于仅在数据成功写入Firebase服务器时才调用此方法,因此这是使用它的正确位置。
此外,如果您希望在读取数据时具有相同的行为,则应使用isFromCache()方法,如我在以下帖子的答案中所解释的:

好的,但是当我没有网络连接时,对话框仍然不会被关闭,因为 onSuccess() 不会被调用。 - Apri
是的,没错。当onSuccess()被触发时,ProgressDialog将会在您重新连接到互联网后消失。这不正是您想要的吗? - Alex Mamo
不,我希望在有网络连接并调用onSuccess()onFailure()时将其关闭,但如果没有网络连接,我也希望将其关闭,然后显示一条消息或其他内容来通知用户上传数据失败。 - Apri
如果你希望在有网络连接时关闭对话框,那么你应该在onSuccess()onFailure()中调用dismiss()方法。但是如果没有网络连接时关闭对话框,那么当重新连接上时你就无法关闭对话框了,因为对话框已经关闭了。如果你想知道设备是否连接到互联网,请查看在Android上检测是否有互联网连接。现在可以了吗? - Alex Mamo
是的,谢谢。我只是想知道如何检测是否有互联网连接。 - Apri
4
我有同样的问题,而这个帖子并没有回答我的问题。 - eslamb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接