2012-11-29 141 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