【问题标题】:How to return the user after finishing the network request? [duplicate]完成网络请求后如何返回用户? [复制]
【发布时间】:2021-09-30 05:51:55
【问题描述】:

在这种方法中,我想在完成请求后不立即获取用户列表,因为它从 Firebase 提供了 0 个用户列表? 为什么运行阻塞协程在这里不起作用?

   fun getAllFollowingsLists(uid: String): List<User> {
        val users = mutableListOf<User>()
        val collection = FirebaseFirestore.getInstance().collection("users")
            .document(uid).collection("followings")

        runBlocking {
            collection.get().addOnCompleteListener {
                for (k in it.result!!) {
                    Log.i(TAG, "getAllFollowingsLists: ${k.toObject(User::class.java)} ")
                    users.add(k.toObject(User::class.java))
                }
            }
        }
        return users
    }


【问题讨论】:

  • 你检查过this answer 吗?
  • 是的,谢谢。但是为什么 runBlocking 在这里不起作用?它应该暂停线程

标签: android firebase kotlin google-cloud-firestore kotlin-coroutines


【解决方案1】:

因为addOnCompleteListener 没有阻塞,所以它没有等待get() 完成就完成了。相反,它放置了一个侦听器,该侦听器将在get() 完成时运行。

addOnCompleteListener 不是异步的,所以 runBlocking 在这里没用。

您应该在侦听器中的 for 循环之后对 List&lt;User&gt; 做任何您想做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 2016-07-22
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多