android - 输出顺序显示错误

标签 android kotlin retrofit coroutine

我遇到了一个非常奇怪的问题。我在 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/

相关文章:

android - 手机重启后恢复闹钟管理器

Android cordova 推送图标丢失

android - 底部栏导航未显示所有标题

android - 使用基本 HTTP 身份验证 : "Cannot retry streamed HTTP body" 改造 POST 请求

android - 如何从 Android 中的内存中释放(强制,如有必要)9-patch (NinePatchDrawable)?

android:未检测到信标

arrays - Kotlin - Val 无法重新分配,但可以通过从索引访问来重新分配?

java - Google meet、zoom 或 vetera 无法与 android webview 一起使用

android - OkHttp 在与改造一起使用时不会重定向 POST 请求

java - 执行过程中出现Retrofit异常