2012-11-29 99 views
0

记录分贝我已经在实施中的Android这个功能... 我只需要输出麦克风redorded分贝了问题,这是我无法理解的事情:安卓:从麦克风

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:只有创建视图层次结构的原始线程可以触及其视图。

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

回答

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()); 
} 
+0

谢谢,我通情达理的这件事。 但现在它给了我新的错误:https://dl.dropbox.com/u/16047047/log.txt logcat不是那么全面... – Zak

+0

Noise.java的第29行是什么? – fiddler

+0

您写给我的line risultato – Zak