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

主要 Activity :

    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
    }


谢谢你的帮助 !

最佳答案

您可以使用Tasks.await完成此任务。

private fun getAllContainerships(): List<Containership>  {
    return try {
        val taskResult = Tasks.await(db.collection("Containership").get(), 2, TimeUnit.SECONDS)
        taskResult.mapTo(ArrayList()) { containership.toObject(Containership::class.java) }, null)
    } catch (e: ExecutionException) {
        //TODO handle exception
    } catch (e: InterruptedException) {
        //TODO handle exception
    } catch (e: TimeoutException) {
        //TODO handle exception
    }
}

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

09-26 00:00