我是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中工作,还是我在做其他错误?
提前致谢。
答案 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