2010-01-25 13 views
8

Mi chiedevo se qualcuno potesse aiutarmi nel threading in background su Android.Android: come eseguire correttamente il threading in background?

Ho un pezzo di codice che registra dal microfono del dispositivo e quindi riproduce ciò che registra attraverso l'auricolare (in 1.5).

Sto cercando di eseguirlo in una discussione ma non sono riuscito a farlo funzionare come thread in background.

Attualmente esegue e blocca l'attività in modo che tutto ciò che accade è il thread è in esecuzione e l'interfaccia utente è bloccata o sembra essere appesa.

Qui è il modo più lastest ho provato a farlo:

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

mi chiedevo se qualcuno mi potesse guida su come trasformare questo in un thread in background? O forse preferisco indicarmi qualche tutorial che potrebbe essere rilevante per il mio caso?

Grazie in anticipo

risposta

14

provare a chiamare record.start() al posto di .run().

Dal Java API Docs:

start() causa questa discussione per iniziare esecuzione; Java Virtual Machine chiama il metodo run di questo thread.

Si consiglia inoltre di esaminare AsyncTask.

+1

Grazie, è stato risolto. Ma è il modo corretto di eseguirlo come backgrond o thread di lavoro? –

+0

È un modo per farlo. Puoi farlo in modo Java implementando un Thread o un Runnable, oppure puoi farlo in modo Android implementando un AsyncTask. Personalmente uso AsyncTask per tutti i thread in background che implemento nelle mie app. –

+0

Grazie a mBaird, esaminerò AsyncTask –

3

Non si dovrebbe chiamare Thread.run, chiami Thread.start

public void run()

Se questa discussione è stata costruito utilizzando un Runnable oggetto corsa separata, allora il metodo percorso che Runnable oggetto è chiamato; altrimenti, questo metodo non fa nulla e restituisce.

+0

Grazie Nikola, Quindi devo implementare eseguibile per renderlo un thread in background? –

+0

In molti casi, sì, fornirai un oggetto Runnable nel costruttore di thread o eseguirai l'override o l'implementazione del metodo run() in una sottoclasse di thread. Una terza opzione è creare un HandlerThread e postare messaggi tramite il suo Handler(). – greg7gkb

Problemi correlati