2010-01-25 25 views
8

Android'de arkaplan üzerinde herkesin bana yardımcı olup olmadığını merak ediyordum.Android - arka plan iş parçacığı nasıl düzgün yapılır?

Cihazın mikrofonundan kaydettiğim bir parça kodum var ve daha sonra kulak parçasından (1.5'de) kaydettiği bilgileri çalar.

Bir iş parçacığında çalıştırmaya çalışıyorum, ancak arka plan iş parçacığı olarak çalıştırılmasında başarısız oldum.

Şu anda etkinliği çalıştırır ve kilitler, böylece tüm o sırada iş parçacığı çalışır ve kullanıcı arabirimi kilitlenir veya asılı görünüyor.

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

herkes bir arka plan iplik çevirmeye nasıl bana yol acaba: Burada

bunu yapmaya çalıştım en son yoldur? Ya da belki de özlemiş olabileceğimiz alakalı bir öğreticiye işaret edebilirmiyim? peşin

cevap

14

deneyin çağıran record.start() yerine .run içinde

Teşekkürler(). Java API Docs itibaren

:

start() yürütülmesine başlamak için bu konu neden olur; Java Sanal Makinesi , bu iş parçacığının çalışma yöntemini çağırır.

Ayrıca AsyncTask'a bakmak isteyebilirsiniz.

Sen Thread.run çağırmamalıdır
+1

Teşekkürler, bunu sıraladı. Ancak bu, bir iş parçacığı veya çalışan iş parçacığı olarak çalıştırmak için doğru yol? –

+0

Bunu yapmanın bir yolu. Bir Thread veya Runnable'ı uygulayarak Java yolunu yapabilir veya AsyncTask'ı uygulayarak Android yolunu yapabilirsiniz. Uygulamalarımda uyguladığım tüm arka plan konuları için AsyncTask'ı kişisel olarak kullanıyorum. mBaird, AsyncTask –

+0

sayesinde Bu yüzden bir arka plan iş parçacığı yapmak için çalıştırılabilir uygulamak gerekiyor? –

3

Konuyu ayrı Runnable çalışma nesnesi kullanılarak inşa edildi ise Thread.start, o Runnable nesnenin çalışma yöntemi

public void run()

olduğunu diyoruz denilen; aksi takdirde, bu yöntem hiçbir şey yapmaz ve döndürür.

+0

Teşekkür Nikola içine bakacağız –

+0

Çoğu durumda, iş parçacığı yapıcısında bir Çalıştırılabilir nesne sağlayacağınız veya bir iş parçacığı alt sınıfında run() yöntemini geçersiz kılacak/uygulayacağınız. Üçüncü bir seçenek HandlerThread oluşturmak ve Handler() aracılığıyla mesaj göndermek. – greg7gkb

İlgili konular