2010-01-25 15 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

的start()使該線程開始執行 ; Java虛擬機 調用此線程的運行方法。

你也可能想看看AsyncTask

+1

謝謝,這就是它的排序。 但是,作爲一個backgrond或工作線程運行它的正確方法? – 2010-01-25 17:36:27

+0

這是一種方法。你可以通過實現一個Thread或一個Runnable來實現Java方式,或者你可以通過實現一個AsyncTask來實現Android方式。我個人使用AsyncTask來處理在我的應用程序中實現的所有後臺線程。 – 2010-01-25 17:39:12

+0

謝謝mBaird,將調查AsyncTask – 2010-01-25 17:53:56

3

你不應該叫Thread.run,叫Thread.start

public void run()

如果該線程是用 一個單獨的Runnable 運行對象構造的,則該Runnable 對象的run方法是所謂的;否則,此方法不執行任何操作 並返回。

+0

謝謝尼古拉, 所以我必須實現runnable使其成爲後臺線程? – 2010-01-25 17:28:52

+0

在很多情況下,是的,你會在線程構造函數中提供一個Runnable對象,或者你會覆蓋/實現線程子類中的run()方法。第三個選項是創建一個HandlerThread並通過它的Handler()向它發送消息。 – greg7gkb 2011-05-24 20:44:37

相關問題