在一个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
}
感谢您的帮助!
答案 0 :(得分:0)
您可以使用Tasks.await完成此操作。
{{1}}
确保这是在后台线程中完成的。另外,请尝试摆脱GlobalScope.async,因为它是一种代码味道(为此,您可以使用MVVM模式,将数据访问代码放在viewmodel中,并从AndroidX生命周期使用viewModelScope)。