Android子线程中显示Toast失败,寻求有效解决方案
问题根源
Toast 必须在UI线程中调用才能正常显示,你当前把Toast的显示逻辑通过Handler(handlerThread.looper).post()提交到了自己创建的子线程(HandlerThread)中,所以无法弹出。
解决方案
方案1:利用inner类特性直接调用runOnUiThread
你的Test是inner类,持有外部MainActivity的引用,完全可以直接调用runOnUiThread:
inner class Test: Thread(){ override fun run(){ this@MainActivity.runOnUiThread { Toast.makeText(this@MainActivity, "Testing: ${handlerThread.name}", Toast.LENGTH_SHORT).show() } } }
方案2:用MainLooper创建Handler,提交任务到UI线程
直接获取主线程的Looper创建Handler,post的任务会自动在UI线程执行:
inner class Test: Thread(){ override fun run(){ Handler(Looper.getMainLooper()).post{ Toast.makeText(this@MainActivity, "Testing: ${handlerThread.name}", Toast.LENGTH_SHORT).show() } } }
方案3:简化代码,避免不必要的线程嵌套
你这里的Test线程其实是多余的,直接在按钮点击逻辑里处理即可,还能减少线程开销:
binding.bTest.setOnClickListener { handlerThread = HandlerThread("Test") handlerThread.start() Thread { // 这里执行子线程耗时任务 Handler(Looper.getMainLooper()).post { Toast.makeText(this@MainActivity, "Testing: ${handlerThread.name}", Toast.LENGTH_SHORT).show() } }.start() }
额外提醒:把handlerThread定义在companion object里是线程不安全的,多个Activity实例会互相覆盖这个变量,建议移到Activity内部作为成员变量。
内容的提问来源于stack exchange,提问作者Adobe
相关产品推荐
相关产品推荐

