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
相关产品推荐
相关产品推荐

