2010-01-25 12 views
8

Zastanawiasz się, czy ktoś może mi pomóc w wątkach w tle na Androida.Android - jak poprawnie wkręcać tło?

Mam kawałek kodu, który nagrywa z mikrofonu urządzenia, a następnie odtwarza to, co nagrywa przez słuchawkę (w 1.5).

Próbuję uruchomić go w wątku, ale nie udało się go uruchomić jako wątek w tle.

Obecnie działa i blokuje działanie, aby wszystko się stało, wątek jest uruchomiony, a interfejs jest zablokowany lub wydaje się, że zwisa.

Oto Ostatnia droga Próbowałem to zrobić:

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; 
       } 
     } 
} 

Zastanawiałem się, czy ktoś mógłby poprowadzić mnie, w jaki sposób przekształcić to wątek tła? A może wskaż mi jakiś samouczek, który może być istotny, który mogłem pominąć?

góry dzięki

Odpowiedz

14

Spróbuj zadzwonić record.start() zamiast .run().

Z Java API Docs:

start() Powoduje ten wątek, aby rozpocząć wykonanie; wirtualna maszyna Java wywołuje metodę uruchamiania tego wątku.

Możesz również zajrzeć do AsyncTask.

+1

Dzięki, to posortowane. Ale czy jest to właściwy sposób uruchomienia go jako wątku backgrond lub wątku roboczego? –

+0

To jeden sposób, aby to zrobić. Możesz to zrobić w Javie, implementując wątek lub Runnable, lub możesz to zrobić w Androidzie, implementując AsyncTask. Osobiście używam AsyncTask do wszystkich wątków w tle, które implementuję w moich aplikacjach. –

+0

Dzięki mBaird, zajrzysz do AsyncTask –

3

Nie należy zadzwonić Thread.run, zadzwoń Thread.start

public void run()

Jeśli ten wątek został skonstruowany przy użyciu oddzielnego Runnable obiektu Uruchom, a następnie metoda prowadzonego Runnable obiektu wynosi nazywa; w przeciwnym razie ta metoda nie zrobi nic, ani nie zwróci żadnej wartości .

+0

Dziękuję Nikola, Czy muszę więc wykonać programowanie, aby uczynić z niego wątek tła? –

+0

W wielu przypadkach tak, albo udostępnisz obiekt Runnable w konstruktorze wątków, albo zastąpisz/zaimplementujesz metodę run() w podklasie wątku. Trzecią opcją jest utworzenie HandlerThread i wysyłanie do niego wiadomości za pośrednictwem Handler(). – greg7gkb