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