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 になり、アプリがクラッシュします: 11-29 14:43:27.133: E/AndroidRuntime(25785): android.view.ViewRoot$CalledFromWrongThreadException:ビュー階層を作成した元のスレッドは、そのビューに触れることができます。

私は周りを検索しましたが、包括的な例を見つけることができません...必要のない多くのものとクラスの例のみです。この問題を解決できますか?

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 に答える