2010-01-25 23 views
8

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

Antwort

14

Try Aufruf record.start() anstelle von .run().

Vom Java API Docs:

Start() verursacht dieses Thema Ausführung zu beginnen; Die Java Virtual Machine ruft die run-Methode dieses Threads auf.

Sie können auch in AsyncTask suchen.

+1

Danke, das ist es sortiert. Aber ist das der richtige Weg, um es als Backgrond oder Worker Thread zu betreiben? –

+0

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. –

+0

Danke mBaird, werde in AsyncTask schauen –

3

Sie sollten Thread.run nicht nennen, rufen Thread.start

public void run()

Wenn dieser Thread einen separaten Runnable Lauf-Objekt, um dann die Runnable run-Methode des Objekts konstruiert ist namens; Andernfalls führt diese Methode nichts und zurück.

+0

Danke Nikola, Also muss ich Runnable implementieren, um es zu einem Hintergrund-Thread zu machen? –

+0

In vielen Fällen werden Sie entweder ein Runnable-Objekt im Thread-Konstruktor bereitstellen oder Sie überschreiben/implementieren die run() -Methode in einer Thread-Unterklasse. Eine dritte Möglichkeit besteht darin, einen HandlerThread zu erstellen und über seinen Handler() Nachrichten an ihn zu senden. – greg7gkb

Verwandte Themen