0

我在 Android 中实现此功能时遇到问题...我只需要输出从麦克风重新录制的分贝,这是我无法理解的事情:

public class Noise extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    MediaRecorder recorder=new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    Timer timer=new Timer();
    timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 500);
}
private class RecorderTask extends TimerTask{
    TextView risultato=(TextView) findViewById(R.id.risultato_recorder);
    private MediaRecorder recorder;
    public RecorderTask(MediaRecorder recorder){
        this.recorder = recorder;
    }
    public void run(){
        risultato.setText(""+recorder.getMaxAmplitude());
    }
}
}

在textview中,只打印第一次的结果,结果为0,然后app crash with: 11-29 14:43:27.133: E/AndroidRuntime(25785): android.view.ViewRoot$CalledFromWrongThreadException: Only the创建视图层次结构的原始线程可以触及其视图。

我四处搜索,但我找不到一个全面的例子......只有很多我不需要的东西和类的例子。我可以解决这个问题吗?

4

1 回答 1

2

UI 组件只能从 UI 线程修改。

您的任务在后台线程中运行,因此您需要强制TextView在 UI 线程中完成更新。您可以使用该Activity.runOnUiThread方法实现它。

试试这个:

public void run(){
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            risultato.setText("" + recorder.getMaxAmplitude());
        }
    });
}

代替

public void run(){
    risultato.setText(""+recorder.getMaxAmplitude());
}
于 2012-11-29T13:55:20.397 回答