2010-01-25 5 views
8

Me preguntaba si alguien podría ayudarme en el enhebrado de fondo en Android.Android: ¿cómo hacer el enhebrado de fondo correctamente?

Tengo un código que registra desde el micrófono del dispositivo y luego reproduce lo que graba a través del auricular (en 1.5).

Estoy tratando de ejecutarlo en un hilo pero no he podido ejecutarlo como hilo de fondo.

Actualmente se ejecuta y se bloquea la actividad para que todo lo que está sucediendo es que el hilo se está ejecutando y la interfaz de usuario está bloqueada o parece estar colgando.

Aquí es la manera más lastest Traté de hacerlo:

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

Me preguntaba si alguien me podría orientar sobre la forma de convertir esto en un subproceso en segundo plano? ¿O quizás me haya dirigido a algún tutorial que pueda ser relevante y que me haya pasado por alto?

Gracias de antemano

Respuesta

14

intente llamar record.start() en lugar de .run().

Desde el Java API Docs:

inicio() hace que este hilo para comenzar ejecución; la Máquina Virtual Java llama al método de ejecución de este hilo.

También es posible que desee mirar en AsyncTask.

+1

Gracias, eso lo ha ordenado. ¿Pero es esa la forma correcta de ejecutarlo como un backgrond o un hilo de trabajo? –

+0

Es una forma de hacerlo. Puedes hacerlo de Java implementando un Thread o un Runnable, o puedes hacerlo de la forma en Android implementando un AsyncTask. Yo personalmente uso AsyncTask para todos los hilos de fondo que implemento en mis aplicaciones. –

+0

Gracias mBaird, se verá en AsyncTask –

3

No debe llamar Thread.run, llama hilo.start

public void run()

Si este hilo se construido utilizando un Ejecutable objeto de ejecución separada, entonces el método de ejecución que Ejecutable del objeto es llamado; de lo contrario, este método no hace nada y lo devuelve.

+0

Gracias Nikola, ¿Debo implementar Runnable para que sea un hilo de fondo? –

+0

En muchos casos, sí proporcionará un objeto Runnable en el constructor de subprocesos, o anulará/implementará el método run() en una subclase de subprocesos. Una tercera opción es crear un HandlerThread y publicar mensajes a través de su Handler(). – greg7gkb

Cuestiones relacionadas