1

トグルボタンをオンにするとスレッドを開始でき、正常に動作します。そのスレッドは、オーディオレコードとオーディオトラックを開始することです。しかし、トグルボタンをオフにするとスレッドを停止できません... thread.stopを実行できないため...私がやりたいのは、audiorecordとaudiotrackを停止することです... w/でそれらを開始/停止する方法があればo スレッドを作ることも問題ありません。また、スレッドを停止できないため、トグルボタンのON - OFF - ONを行うと、スレッドを2回起動できずにエラーになります。

4

4 に答える 4

0

この場合、私はハンドラーを好みます。

彼らには2つの特徴があります

Handler audioHandler = new Handler();

audioHandler.post(startAudio);   // Starts the operations

audioHandler.removeCallbacks(startAudio); //Stops the Operation

次のスニペットが役立ちます。

package org.sample;

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.widget.CompoundButton;
import android.widget.ToggleButton;

public class SampleActivity extends Activity {

    private Handler audioHandler;
    private Runnable startAudio;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        audioHandler = new Handler();

        startAudio = new Runnable() {

            @Override
            public void run() {
                isRecording = true;
                android.os.Process
                        .setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
                int buffersize = AudioRecord.getMinBufferSize(8000,
                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
                arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025,
                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_16BIT, buffersize);
                int bufferzize = AudioTrack.getMinBufferSize(11025,
                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
                atrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025,
                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_16BIT, bufferzize,
                        AudioTrack.MODE_STREAM);
                atrack.setPlaybackRate(11025);
                byte[] buffer = new byte[buffersize];
                if (arec.getState() == AudioRecord.STATE_INITIALIZED)
                    arec.startRecording();
                if (atrack.getState() == AudioTrack.STATE_INITIALIZED)
                    atrack.play();
                while (isRecording) {
                    arec.read(buffer, 0, buffersize);
                    atrack.write(buffer, 0, buffer.length);
                }

                audioHandler.post(startAudio);

            }
        };

        tbs = (ToggleButton) findViewById(R.id.tbS);
        tbs.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                // TODO Auto-generated method stub
                if (isChecked) {
                    audioHandler.post(startAudio);
                } else {
                    audioHandler.removeCallbacks(startAudio);
                }

            }
        });

    }
}
于 2012-07-01T13:31:32.997 に答える
0

Threadのstop()メソッドは(本質的に安全ではないため)推奨されておらず、Java は Thread を停止する別の方法を提供しています。この公式リンクで説明されているように、非常に単純なアプローチです。

http://docs.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

isRecording変数をグローバルにしてから、その状態を変更しようとしましたか:

 isRecording = false;

 Thread thread;

 Runnable r = new Runnable() {
public void run() {
    isRecording = true;
    android.os.Process
            .setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
    int buffersize = AudioRecord.getMinBufferSize(8000,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT);
    arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT, buffersize);
    int bufferzize = AudioTrack.getMinBufferSize(11025,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT);
    atrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT, bufferzize,
            AudioTrack.MODE_STREAM);
    atrack.setPlaybackRate(11025);
    byte[] buffer = new byte[buffersize];
    if (arec.getState() == AudioRecord.STATE_INITIALIZED)
        arec.startRecording();
    if (atrack.getState() == AudioTrack.STATE_INITIALIZED)
        atrack.play();
    while (isRecording) {
        arec.read(buffer, 0, buffersize);
        atrack.write(buffer, 0, buffer.length);
    }
}

};

tbs = (ToggleButton) findViewById(R.id.tbS);
tbs.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

    public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {
        // TODO Auto-generated method stub
        if (isChecked) {
            thread = new Thread(r)
            thread.start();
            } else {
          isRecording = false;
          thread = null;
        }

    }
});
于 2012-07-01T13:43:18.317 に答える
0

スレッドは存続している限り存続しisRecordingますtrue。したがって、必要に応じてfinal StringBuilderの値を操作する with を持つことができisRecordingます。

  final StringBuilder isRecording=new StringBuilder("t");
Thread thread = new Thread() {
            public void run() {

                android.os.Process
                        .setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
                int buffersize = AudioRecord.getMinBufferSize(8000,
                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
                arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025,
                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_16BIT, buffersize);
                int bufferzize = AudioTrack.getMinBufferSize(11025,
                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_16BIT);
                atrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025,
                        AudioFormat.CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_16BIT, bufferzize,
                        AudioTrack.MODE_STREAM);
                atrack.setPlaybackRate(11025);
                byte[] buffer = new byte[buffersize];
                if (arec.getState() == AudioRecord.STATE_INITIALIZED)
                    arec.startRecording();
                if (atrack.getState() == AudioTrack.STATE_INITIALIZED)
                    atrack.play();
                while (isRecording.toString().equals("t")) {
                    arec.read(buffer, 0, buffersize);
                    atrack.write(buffer, 0, buffer.length);
                }
            }

        };
    tbs = (ToggleButton) findViewById(R.id.tbS);
        tbs.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                // TODO Auto-generated method stub
                if (isChecked) {
                    isRecording.replace(0,0,"t");
                    thread.start();
                    } else {
                isRecording.replace(0,0,"f")
                }

            }
        });
于 2012-07-01T14:16:30.217 に答える
0

たぶん、変数を使用して、その状態の場合に実行される関数をチェックインできます。

   tbs = (ToggleButton) findViewById(R.id.tbS);
   boolean stopThread = false;
    tbs.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

    public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {
        // TODO Auto-generated method stub
        if (isChecked) {

            thread.start();
            } else {
          stopThread = true;
        }

    }
});
      Thread thread = new Thread() {
public void run() {
    isRecording = true;
    android.os.Process
            .setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
    int buffersize = AudioRecord.getMinBufferSize(8000,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT);
    arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT, buffersize);
    int bufferzize = AudioTrack.getMinBufferSize(11025,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT);
    atrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT, bufferzize,
            AudioTrack.MODE_STREAM);
    atrack.setPlaybackRate(11025);
    byte[] buffer = new byte[buffersize];
    if (arec.getState() == AudioRecord.STATE_INITIALIZED)
        arec.startRecording();
    if (atrack.getState() == AudioTrack.STATE_INITIALIZED)
        atrack.play();
    while (isRecording) {
        arec.read(buffer, 0, buffersize);
        atrack.write(buffer, 0, buffer.length);
    }

    if(stopThread)
        return;
}

};
于 2012-07-01T13:28:02.613 に答える