我正在使用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()
方法,如以下帖子中我的回答所述: