Ich frage mich, ob mir jemand im Hintergrund Threading auf Android helfen könnte.Android - Wie man Hintergrund Threading richtig macht?
Ich habe ein Stück Code, der vom Mikrofon des Geräts aufzeichnet und dann wiedergibt, was es durch das Ohrstück aufzeichnet (auf 1.5).
Ich versuche, es in einem Thread auszuführen, aber es war nicht erfolgreich, es als Hintergrund-Thread ausführen zu lassen.
Momentan läuft es und blockiert die Aktivität, so dass alles passiert, ist der Thread läuft und die Benutzeroberfläche ist gesperrt oder scheint zu hängen.
Hier ist die neueste Art und Weise habe ich versucht, es zu tun:
public class LoopProg extends Activity {
boolean isRecording; //currently not used
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
AudioManager audio_service = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audio_service.setSpeakerphoneOn(false);
audio_service.setMode(AudioManager.MODE_IN_CALL);
audio_service.setRouting(AudioManager.MODE_NORMAL,
AudioManager.ROUTE_EARPIECE, AudioManager.ROUTE_ALL);
Record record = new Record();
record.run();
}
public class Record extends Thread
{
static final int bufferSize = 200000;
final short[] buffer = new short[bufferSize];
short[] readBuffer = new short[bufferSize];
public void run() {
isRecording = true;
android.os.Process.setThreadPriority
(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int buffersize = AudioRecord.getMinBufferSize(11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioRecord arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize);
AudioTrack atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize,
AudioTrack.MODE_STREAM);
setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
atrack.setPlaybackRate(11025);
byte[] buffer = new byte[buffersize];
arec.startRecording();
atrack.play();
while(isRecording) {
arec.read(buffer, 0, buffersize);
atrack.write(buffer, 0, buffer.length);
}
arec.stop();
atrack.stop();
isRecording = false;
}
}
}
ich mich gefragt, ob jemand auf mich führen könnte, wie dies in einem Hintergrund-Thread zu verwandeln? Oder vielleicht verweisen Sie mich auf ein Tutorial, das relevant sein könnte, das ich vielleicht verpasst habe?
Vielen Dank im Voraus
Danke, das ist es sortiert. Aber ist das der richtige Weg, um es als Backgrond oder Worker Thread zu betreiben? –
Es ist eine Möglichkeit, es zu tun. Sie können dies auf Java-Art tun, indem Sie entweder einen Thread oder ein Runnable implementieren, oder Sie können es auf Android-Art tun, indem Sie eine AsyncTask implementieren. Ich benutze AsyncTask persönlich für alle Hintergrundthreads, die ich in meinen Apps implementiere. –
Danke mBaird, werde in AsyncTask schauen –