2010-01-25 3 views
8

Android에서 배경 스레딩에 도움이 될만한 사람이 있는지 궁금합니다.Android - 백그라운드 스레딩을 올바르게 수행하는 방법?

나는 장치의 마이크에서 녹음 한 코드를 가지고 이어 피스 (1.5)를 통해 녹음 한 코드를 재생합니다.

스레드에서 실행하려고하지만 백그라운드 스레드로 실행하는 데 실패했습니다.

현재 활동을 실행하고 잠궈 모든 현상이 스레드가 실행되고 UI가 잠겨 있거나 걸려있는 것처럼 보입니다.

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

사람이 백그라운드 스레드로이를 설정하는 방법에 나를 인도 할 수 있다면 궁금 : 여기

내가 그것을 할 시도 최신 방법은? 아니면 내가 놓친 것일 수있는 튜토리얼을 가르쳐 주시겠습니까? 사전

답변

14

에 한번 호출 record.start() 대신 .RUN에서

감사합니다(). Java API Docs에서

:

시작은() 실행을 시작하는이 thread를 대기시킵니다; Java 가상 머신 은이 스레드의 run 메소드를 호출합니다.

AsyncTask을 살펴볼 수도 있습니다.

당신은 Thread.run를 호출해서는 안
+1

감사합니다. 하지만 backgrond 또는 worker 스레드로 실행하는 올바른 방법입니까? –

+0

그것은 그것을하는 한 방법입니다. Thread 또는 Runnable을 구현하여 Java 방식으로 처리하거나 AsyncTask를 구현하여 Android 방식으로 처리 할 수 ​​있습니다. 나는 개인적으로 내 애플 리케이션에서 구현하는 모든 백그라운드 스레드에 AsyncTask를 사용한다. –

+0

고마워 mBaird, AsyncTask를 살펴 보겠습니다 –

3

,이 스레드가 별도의 Runnable 실행 객체를 사용해 작성되었을 경우 Thread.start는, 그 Runnable를 객체의 실행 방법은

public void run()

입니다 전화 불렀다; 그렇지 않으면이 메서드는 아무 것도 수행하지 않고 을 반환합니다.

+0

고마워요 Nikola, 그래서 백그라운드 스레드를 만들기 위해 runnable을 구현해야합니까? –

+0

많은 경우, 스레드 생성자에 Runnable 객체를 제공하거나 스레드 하위 클래스에서 run() 메서드를 재정의하거나 구현합니다. 세 번째 옵션은 HandlerThread를 만들고 Handler()를 통해 메시지를 게시하는 것입니다. – greg7gkb

관련 문제