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

Android中如何在同一类的非主线程修改Button控件属性?

非主线程修改Android UI的最简解决方案

问题原因

Android系统强制要求所有UI操作必须在主线程(UI线程)中执行,非主线程直接调用UI控件方法会触发CalledFromWrongThreadException。你代码里的gameButton.setText(String.valueOf(out))就是在子线程中执行,所以引发报错。

最简解决方法

直接使用Activity自带的runOnUiThread()方法,把UI操作代码包裹在该方法内部,让逻辑切换到主线程执行。这种方案改动最小,无需引入额外类或框架。

修改后的代码

仅需调整soundThread()方法中的UI操作部分,同时修正代码中的笔误(ini改为int):

private void soundThread(){
    // 修正笔误:ini → int
    for(int i = 0; i < 100; i++)
    {
        sProc.start(this);
        try {
            Thread.sleep(1000);
            double out = sProc.getAmplitude();
            // 用runOnUiThread包裹UI操作,切换到主线程执行
            runOnUiThread(() -> {
                gameButton.setText(String.valueOf(out));
            });
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        sProc.stop();
    }
}

代码说明

  • runOnUiThread()是Activity的内置方法,它会自动判断当前线程:如果当前是主线程,直接执行Runnable内的代码;如果是子线程,就把任务发送到主线程的消息队列,由主线程调度执行。
  • 使用Lambda表达式简化Runnable的写法,让代码更简洁直观。

内容的提问来源于stack exchange,提问作者Mich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:30:31