如何在Kotlin(Android)中等待Firebase通话结束

时间:2019-03-31 13:31:38

标签: android multithreading kotlin coroutine

在一个Android应用程序中,我试图进行一次Firebase调用,该调用将填充ArrayAdapter以便显示飞船列表。 当我使用本地ArrayList时,它可以工作,但是我的firebase调用无法正常工作。 由于该Firebase调用是异步的,因此android在结束Firebase调用之前向我显示了该应用程序,因此ArrayAdapter为空,布局也为空。 我尝试使用在线上看到的协程方法,但似乎无法正常工作。 有人能帮我吗 ? 这是我的源代码:

MainActivity:

    override fun onCreate(savedInstanceState: Bundle?){
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var containerShips : List<Containership> = listOf()
        val db = Database()

        runBlocking {
            containerShips = db.getAllContainerships()
        }




        val arrayAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, containerShips)

        val listShipDetails = findViewById<ListView>(R.id.listShipDetails)

        listShipDetails.adapter = arrayAdapter

    }

数据库:

   suspend fun getAllContainerships() : List<Containership> {
        val list : MutableList<Containership> = mutableListOf()
        val job = GlobalScope.launch {
            db.collection("Containership").get().addOnSuccessListener { result ->
                for (containership in result) {
                    list.add(containership.toObject(Containership::class.java))
                    println(containership.toObject(Containership::class.java))
                }
            }
        }
        job.join()
        return list
    }

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用Tasks.await完成此操作。

{{1}}

确保这是在后台线程中完成的。另外,请尝试摆脱GlobalScope.async,因为它是一种代码味道(为此,您可以使用MVVM模式,将数据访问代码放在viewmodel中,并从AndroidX生命周期使用viewModelScope)。