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

相关问题