我正在尝试使用以下代码获取保存在Firebase中的信息(“ firstDate”):
if(currentUser != null){
val ref = FirebaseDatabase.getInstance().getReference("Users").child(FirebaseAuth.getInstance().currentUser!!.uid)
val menuListener = object : ValueEventListener {
override fun onCancelled(databaseError: DatabaseError) {
// handle error
}
@SuppressLint("SetTextI18n", "LongLogTag")
override fun onDataChange(dataSnapshot: DataSnapshot) {
user = dataSnapshot.getValue(User::class.java)
Log.i("************************* before Assignement", myFirstDay)
myFirstDay = user?.firstDate
Log.i("************************* after Assignement", myFirstDay)
}
}
ref.addValueEventListener(menuListener)
}
getFirstDayReg()
Log.i("************************* myFirstDayReg", myFirstDay)
问题: ref.addValueEventListener(menuListener)之前的所有内容都会返回正确的答案,但是这个答案是:
Log.i("************************* myFirstDayReg", myFirstDay)
它没有给我任何东西(无回报/一无所有)
请帮助获取值用户?.firstDate并分配给
myFirstDay
,因为以后需要在代码中使用它。
根据亚历克斯先生的回答,我编写了这段代码,但是我仍然遇到相同的问题,没有任何改变
interface MyCallback {
fun onCallback(value: String)
}
fun readData(myCallback: MyCallback){
if(currentUser != null){
val ref = FirebaseDatabase.getInstance().getReference("Users").child(FirebaseAuth.getInstance().currentUser!!.uid)
val menuListener = object : ValueEventListener {
override fun onCancelled(databaseError: DatabaseError) {
// handle error
}
@SuppressLint("SetTextI18n", "LongLogTag")
override fun onDataChange(dataSnapshot: DataSnapshot) {
user = dataSnapshot.getValue(User::class.java)
Log.i("************************* before Assignement", user?.firstDate!!)
myFirstDay = user?.firstDate!!
myCallback.onCallback(user?.firstDate!!)
}
}
ref.addListenerForSingleValueEvent(menuListener)
}
}
readData(object: MyCallback {
override fun onCallback(value: String) {
Log.d("TAGTAGTAGTAGTAGTAGTAG", user?.firstDate)
}
})
答案 0 :(得分:1)
下面的代码行不给您任何内容,因为它位于回调之外:
Log.i("************************* myFirstDayReg", myFirstDay)
在调用此行时,尚未完成从数据库的数据加载。请记住,Firebase API是异步的,这意味着onDataChange()
方法在调用后立即返回,但是从数据库中获得的结果是在一段时间后出现的。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得数据。由于该方法会立即返回,因此您尚未尝试从myFirstDay
方法之外使用它的onDataChange()
变量的值。
基本上,您正在尝试从异步API同步使用myFirstDay
的值。那不是一个好主意。您应该按预期异步处理API。
此问题的快速解决方案是仅在回调中使用myFirstDay
,否则我建议您从此 post 中查看anwser的最后一部分,其中我已经解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。
答案 1 :(得分:-1)
根据我的朋友亚历克斯所说,我在处理程序中编写了代码仅5秒钟,现在一切正常:
Handler().postDelayed({
// Your Code
},5000)