活动

时间:2018-06-09 13:57:49

标签: android firebase firebase-realtime-database kotlin

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

现在我遇到的问题是EventListener从未被触发过,所以当然,我得到了一个null对象。

这是我的数据类:

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中工作,还是我在做其他错误?

提前致谢。

1 个答案:

答案 0 :(得分:0)

当您致电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
}

当您使用此应用程序运行应用程序时,输出可能是:

  

开始从数据库中读取。

     

获得用户。

     

用户从数据库中读取。

这可能不是你预期的顺序。 Firebase异步加载数据库中的数据,因为结果可能需要一些时间。您的代码可以继续,而不是让您的应用等待(这将触发“应用程序无响应”对话框)。在你拨打getUserSnap时,该用户尚未加载。

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