android - Activity 之外的 Firebase 数据库 EventListener

标签 android firebase firebase-realtime-database kotlin

我是 Android 和 Kotlin 的新手,我想在我的项目中实现一个返回特定数据库快照的 FirebaseRetriever 类。

现在我遇到了永远不会触发 EventListener 的问题,因此,当然,我得到了一个空对象。

这是我的数据类:

public class FirebaseRetriever() {

    private val TAG = "FirebaseRetriever"
    private lateinit var fbData: FirebaseDatabase
    private lateinit var fbAuth: FirebaseAuth
    private lateinit var userRef: DatabaseReference
    //Snapshots
    private lateinit var userSnap: DataSnapshot

    init {
        fbData = FirebaseDatabase.getInstance()
        userRef = fbData.reference.child("users")
        fbAuth = FirebaseAuth.getInstance()

        userRef.addValueEventListener(object : ValueEventListener {
            override fun onCancelled(e: DatabaseError) {
                Log.e(TAG, "Data could not be retrieved from Database." + e.message)
            }

            override fun onDataChange(snap: DataSnapshot) { // is never executed
                userSnap = snap 
            }

        })
    }

    public fun getUserSnap(): DataSnapshot {
        return userSnap // returns null
    }
}

这就是我调用 getUser() 的方式:

firebaseRetriever = FirebaseRetriever()
...
val uniSnap = firebaseRetriever.getUniSnap()

Firebase EventListener 是否有可能只能在常规 AndroidActivity 中工作,还是我做错了什么?

提前致谢。

最佳答案

当您调用 getUserSnap 时,数据很可能还没有加载。要验证这一点,请添加更多日志语句:

Log.i(TAG, "Starting to read from database.")

userRef.addValueEventListener(object : ValueEventListener {
    override fun onCancelled(e: DatabaseError) {
        Log.e(TAG, "Data could not be retrieved from Database." + e.message)
    }

    override fun onDataChange(snap: DataSnapshot) { // is never executed
        Log.i(TAG, "User read from database.")
        userSnap = snap 
    }

})

public fun getUserSnap(): DataSnapshot {
    Log.i(TAG, "Getting user.")
    return userSnap // returns null
}

当你用这个运行你的应用程序时,输出可能是:

Starting to read from database.

Getting user.

User read from database.

这可能不是您期望的顺序。 Firebase 异步从数据库加载数据,因为结果可能需要一些时间才能可用。允许您的代码继续运行,而不是让您的应用程序等待(这会触发应用程序无响应对话框)。但在您调用 getUserSnap 时,该用户尚未加载。

最简单的解决方案是将所有需要用户访问的代码移到 onDataChange() 方法中。另请参阅我对这个问题的回答以获得更灵活的解决方案,这需要更多代码:getContactsFromFirebase() method return an empty list

关于android - Activity 之外的 Firebase 数据库 EventListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50775034/

相关文章:

android - OpenGL 纹理的分辨率是否会自动缩小?

android - 是否可以@Inject 成员(通过@Provides 提供),包含来自基本 Activity 的 Activity 上下文

firebase - Firebase中基于多个where子句的查询

swift - 我想按日期在 firebase 中保存数据意味着用户保存的所有数据都保存在该日期

Ionic 2 应用程序中的 Firebase 身份验证网络错误

database - 如何在 Android 虚拟设备上找到数据库文件?

java - NumberFormatException - Invalid Int

android - java.lang.NoClassDefFoundError : com. 谷歌.android.gms.common.internal.zzbp

ios - 当发送自定义数据时,当后台应用程序对 native ios 使用react时,FCM 无法接收通知

Android Firebase 数据库查询选择条件