我正在嘗試從 Firebase 獲取資料并將其作為陣列回傳。到目前為止,這是有效的,但是資料仍然是我設定的默認資料。
這是代碼(我添加了一些注釋以闡明它在哪里起作用以及 id 在何處不起作用):
fun getRandomQuestion() : ArrayList<ArrayList<String>>{
val random = Random(1234567)
val randQuestionId = random.nextInt(0, 27)
var dataRequestResult : String = "empty"
var requestSide1 : String = "empty"
var requestSide2 : String = "empty"
var requestCount1 : String = "empty"
var requestCount2 : String = "empty"
//Get a random question from the DB
Firebase.database.reference.child(Constants.wyrDBQuestionLocation)
.child(randQuestionId.toString())
.get()
.addOnFailureListener { task ->
Log.i("Get WYR Question Status", "Failed: " task.message.toString())
requestSide1 = "empty"
requestSide2 = "empty"
requestCount1 = "empty"
requestCount2 = "empty"
}.addOnSuccessListener {
Log.i("Get WYR Question Status", "Success")
//Logging this data returns the correct information from firebase, no issue here
Log.i("Request Data Result", it.value.toString())
dataRequestResult = it.value.toString()
}
requestSide1 = dataRequestResult.substringAfter("side1Question=").substringBefore("}")
requestSide2 = dataRequestResult.substringAfter("side2Question=").substringBefore(",")
requestCount1 = dataRequestResult.substringAfter("sideCount1=").substringBefore(",")
requestCount2 = dataRequestResult.substringAfter("sideCount2=").substringBefore(",")
//Return the value
return arrayListOf(arrayListOf(requestSide1, requestCount1), arrayListOf(requestSide2, requestCount2))
}
我嘗試獲取回傳值的活動:
val myQuestion = databaseController.getRandomQuestion()
//This is where the issue lies
//When I get the returned data from the function above, it gives me all of the defaults I had set in the function (which is "empty")
//It logs:`[["empty", "empty"],["empty", "empty"]]`
Log.i("My Question", myQuestion.toString())
成功監聽器中的資料是正確的,但回傳值仍然是默認值。這是日志的影像:

“請求日志結果”,不要介意結果,我正在制作一個 WYR 應用程式。
我注意到聽眾的請求是最后一個,而不是第一個
我認為這與資料甚至還沒有完全收集有關,因為在我制作的另一個應用程式中,我所要做的就是給它一個延遲并設定它,但在這種情況下,我不知道該怎么做.
任何幫助將不勝感激!:)
uj5u.com熱心網友回復:
請求資料庫資料時使用的偵聽器將在getRandomQuestion函式回傳之后觸發ArrayList。您可以使用Kotlin 協程來處理回呼并暫停協程直到回呼被觸發,例如:
suspend fun getRandomQuestion() = suspendCoroutine<String> { continuation ->
Firebase.database.reference.child(Constants.wyrDBQuestionLocation)
.child(randQuestionId.toString())
.get()
.addOnFailureListener { task ->
continuation.resume("empty")
}.addOnSuccessListener {
continuation.resume(it.value.toString())
}
}
// somewhere in your code (e.g. in ViewModel, Activity or Fragment):
someCoroutineScope.launch {
val question: String = getRandomQuestion();
// ... use question to update UI
}
在Activity或者Fragment您可以使用lifecycleScope, ViewModelin- viewModelScope。
suspendCoroutinebuilder 函式用于等待回呼。suspendCoroutine掛起它執行的協程,直到我們決定通過呼叫適當的方法繼續 - Continuation.resume...。
uj5u.com熱心網友回復:
這是我的解決方案
方法一
fun getRandomQuestion() : ArrayList<ArrayList<String>>{
val random = Random(1234567)
val randQuestionId = random.nextInt(0, 27)
var dataRequestResult : String = "empty"
var requestSide1 : String = "empty"
var requestSide2 : String = "empty"
var requestCount1 : String = "empty"
var requestCount2 : String = "empty"
//Get a random question from the DB
Firebase.database.reference.child(Constants.wyrDBQuestionLocation)
.child(randQuestionId.toString())
.get()
.addOnFailureListener { task ->
Log.i("Get WYR Question Status", "Failed: " task.message.toString())
requestSide1 = "empty"
requestSide2 = "empty"
requestCount1 = "empty"
requestCount2 = "empty"
}.addOnSuccessListener {
Log.i("Get WYR Question Status", "Success")
//Logging this data returns the correct information from firebase, no issue here
Log.i("Request Data Result", it.value.toString())
dataRequestResult = it.value.toString()
requestSide1 = dataRequestResult.substringAfter("side1Question=").substringBefore("}")
requestSide2 = dataRequestResult.substringAfter("side2Question=").substringBefore(",")
requestCount1 = dataRequestResult.substringAfter("sideCount1=").substringBefore(",")
requestCount2 = dataRequestResult.substringAfter("sideCount2=").substringBefore(",")
}
//Return the value
return arrayListOf(arrayListOf(requestSide1, requestCount1), arrayListOf(requestSide2, requestCount2))
}
方法二
fun getRandomQuestion() : ArrayList<ArrayList<String>>{
val random = Random(1234567)
val randQuestionId = random.nextInt(0, 27)
var dataRequestResult : String = "empty"
var requestSide1 : String = "empty"
var requestSide2 : String = "empty"
var requestCount1 : String = "empty"
var requestCount2 : String = "empty"
//Get a random question from the DB
Firebase.database.reference.child(Constants.wyrDBQuestionLocation)
.child(randQuestionId.toString())
.get()
.addOnFailureListener { task ->
Log.i("Get WYR Question Status", "Failed: " task.message.toString())
requestSide1 = "empty"
requestSide2 = "empty"
requestCount1 = "empty"
requestCount2 = "empty"
}.addOnSuccessListener {
Log.i("Get WYR Question Status", "Success")
//Logging this data returns the correct information from firebase, no issue here
Log.i("Request Data Result", it.value.toString())
dataRequestResult = it.value.toString()
requestSide1 = dataRequestResult.substringAfter("side1Question=").substringBefore("}")
requestSide2 = dataRequestResult.substringAfter("side2Question=").substringBefore(",")
requestCount1 = dataRequestResult.substringAfter("sideCount1=").substringBefore(",")
requestCount2 = dataRequestResult.substringAfter("sideCount2=").substringBefore(",")
//Return the value
return arrayListOf(arrayListOf(requestSide1, requestCount1), arrayListOf(requestSide2, requestCount2))
}
return null
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/394272.html
上一篇:SwiftUI延遲視圖變數
