我想显示一个进度对话框,并在onCompleteListener
做出如下响应后将其关闭:
class DialogSubjectsAdd: DialogFragment() {
private val db = FirebaseFirestore.getInstance().collection("courses")
private var docFetched = false
private var processCompleted = false
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
super.onCreateDialog(savedInstanceState)
getCoursesIndexDoc()
// show progress dialog
// wait until download operation is completed
while (!processCompleted) {}
// dismiss dialog
// todo
}
private fun getCoursesIndexDoc() {
// fetch the index document
db.document("all")
.get()
.addOnCompleteListener { task ->
if (task.isSuccessful) {
docFetched = true
}
processCompleted = true
}
}
}
但是上面的代码冻结了应用程序。
如果我在while
循环中添加注释,并将对话框代码取消为:
// while (!processCompleted) {}
// // dismiss dialog
进度对话框永远显示。
那么,为什么while
循环会冻结应用程序?
即使processCompleted
的值永远不会变成true
,我认为它应该导致进度条永远运行而不是冻结应用程序。
但是由于dialog
循环,进度while
也没有显示,并且显示dialog
的按钮仍然被单击,应用程序被冻结,为什么?
答案 0 :(得分:1)
这是因为onCreateDialog
在系统的UI线程上运行-意味着在运行某些内容时UI无法更新。
解决方案是将代码移动以将对话框关闭到单独的线程-您的完成侦听器似乎是完美的地方!
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
super.onCreateDialog(savedInstanceState)
getCoursesIndexDoc()
// Don't do anything else here!
}
private fun getCoursesIndexDoc() {
// fetch the index document
db.document("all")
.get()
.addOnCompleteListener { task ->
if (task.isSuccessful) {
docFetched = true
}
// Instead of setting the flag, dismiss the dialog here
}
}