You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 23:02:24