我正在使用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()
    }
}

这很好用,但是有一个异常(exception)。当我想将数据加载到Firestore但没有互联网连接时,onSuccessListener和onFailureListener都不会被调用。我知道这是因为它们仅在将数据写入Firestore时才被调用。但是我不知道有什么其他方法可以检查是否有连接。例如,当我想显示一个进度对话框直到数据成功写入Firestore时,如果没有连接,它不会消失。那么我该如何检查呢?

最佳答案

首先是第一件事。 Cloud Firestore客户端已经在后台线程中运行所有网络操作。这意味着所有操作都在不阻塞主线程的情况下进行。将其放入AsyncTask并不会给而不是提供任何其他好处。



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

此外,如果要在读取数据时具有相同的行为,则应使用isFromCache()方法,如以下帖子中我的回答所述:

  • Listen For MetaData Changes in Firebase Firestore database
  • 10-05 21:16
    查看更多