在一个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)。