首页 > 解决方案 > 虽然循环会阻止 UI 并且不会通过 Android Studio 中的按钮退出

问题描述

一个 while 循环阻止了我的应用程序的 UI 显示,所以我没有机会按下取消按钮来摆脱它。此外,如果我能够通过从 TextToSpeech OnInitListener 块调用设置函数来显示 UI,我仍然无法注册按钮按下并退出。

为什么会发生这种情况?如何获得正常的、非阻塞的 while 循环行为,我可以通过 UI 中的取消按钮单击按钮退出?

这个 onCreate根本不显示 UI

 class MainActivity : AppCompatActivity() {
        lateinit var myTestClass: TestClass

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

           setupTheTestClass()
        }

当我在 TextToSpeech OnInitListener 中调用 setupTheTestClass() 时,此 onCreate显示 UI ,但不会注册按钮按下以让我退出 while 循环

class MainActivity : AppCompatActivity() {
        lateinit var myTestClass: TestClass
        lateinit var mTTS:TextToSpeech

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            mTTS = TextToSpeech(applicationContext, TextToSpeech.OnInitListener { status ->
                setupTheTestClass()
            })
        }

        fun setupTheTestClass()
        {
            myTestClass = TestClass(cancelBtn)
            myTestClass.setupOnClickForButtons()
            myTestClass.testWhileLoop() // blocks UI in first example
        }


        class TestClass(val cancelBtn: Button) {
        var running: Boolean = true

        fun setupOnClickForButtons()
        {
            cancelBtn.setOnClickListener {
                running = false
                println("no longer running")
            }
        }

        fun testWhileLoop() {
            while (running == true) {
                println("running")
            }
        }
    }

界面布局

标签: android-studiokotlin

解决方案


将 testWhileLoop() 函数放在协程中似乎有效

    fun setupTheTestClass()
    {
        myTestClass = TestClass(cancelBtn)
        myTestClass.setupOnClickForButtons()

//        myTestClass.testWhileLoop()

        GlobalScope.launch{
            myTestClass.testWhileLoop()

        }

    }

推荐阅读