Android正在等待听众冻结应用程序?

时间:2019-06-16 00:03:49

标签: android kotlin listener

我想显示一个进度对话框,并在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的按钮仍然被单击,应用程序被冻结,为什么?

1 个答案:

答案 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
        }
}