我在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,然后应用程序崩溃: 11-29 14:43:27.133:E / AndroidRuntime(25785):android.view.ViewRoot $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。
我一直在寻找,但我找不到一个全面的例子......只有很多我不需要的东西和课程的例子。 我能解决这个问题吗?
答案 0 :(得分:2)
只能从UI线程修改UI组件。
您的任务在后台线程中运行,因此您需要强制在UI线程中完成TextView
更新。您可以使用Activity.runOnUiThread
方法实现它。
试试这个:
public void run(){
runOnUiThread(new Runnable() {
@Override
public void run() {
risultato.setText("" + recorder.getMaxAmplitude());
}
});
}
而不是
public void run(){
risultato.setText(""+recorder.getMaxAmplitude());
}