我遇到了一个非常奇怪的问题。我在 FragemtA
中有一个 HashMap 列表 (groupList)。每次运行fragmentA
时,都会调用checkUser
函数,最后将返回值显示在forEach
处。
var id = ""
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val userId = checkUser()
activity.groupedList.forEach {
for (i in it.value) {
Log.d(TAG, "user id in groupedList" + userId)
}
}
fun checkUser(): String {
GlobalScope.launch(Dispatchers.Main) {
val response = WebApi.getOrganizationsList(activity)
if (response?.status == "success") {
id = response?.user_id.toString()
Log.d(TAG,"id in checkUser "+id)
} else {
longToast("FAIL")
}
}
return id
}
为什么我会得到这个输出?
D/xxx: user id in groupedList
D/xxx: user id in groupedList
D/xxx: id in checkUser 46
我希望首先显示 checkUser 46 中的 id
,但事实并非如此!
所需输出
D/xxx: id in checkUser 46
D/xxx: user id in groupedList 46
D/xxx: user id in groupedList 46
最佳答案
您正在启动一个线程,但不等待它完成。改成等待就可以了。顺便说一句,通常不鼓励使用 GlobalScope。您应该考虑在您的类上实现 CoroutineScope,以便您可以简单地使用关键字“launch”。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
GlobalScope.launch {
val userId = checkUser()
activity.groupedList.forEach {
for (i in it.value) {
Log.d(TAG, "user id in groupedList" + userId)
}
}
}
suspend fun checkUser(): String = suspendCoroutine { c->
GlobalScope.launch(Dispatchers.Main) {
var id = ""
val response = WebApi.getOrganizationsList(activity)
if (response?.status == "success") {
id = response?.user_id.toString()
Log.d(TAG,"id in checkUser "+id)
} else {
longToast("FAIL")
}
c.resume(id)
}
}
关于android - 输出顺序显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55635256/