Android - 如何正确执行后台线程?

标签 android audio multithreading background

想知道是否有人可以帮助我解决 Android 上的后台线程问题。

我有一段代码可以从设备的麦克风录音,然后通过耳机(1.5 版)播放它录音的内容。

我试图在一个线程中运行它,但未能成功使其作为后台线程运行。

目前它正在运行并锁定 Activity,因此所有发生的事情都是线程正在运行并且 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;
              }
      }
}

我想知道是否有人可以指导我如何将其变成后台线程?或者预示我可能错过了一些可能相关的教程?

提前致谢

最佳答案

尝试调用 record.start() 而不是 .run()。

来自Java API Docs :

start() Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.

您可能还想查看 AsyncTask .

关于Android - 如何正确执行后台线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2133957/

相关文章:

android - ProgressDialogs 和 Material 设计规范

android - 将我的应用程序添加到 "add shortcut"列表以在主屏幕上有一个快捷方式

java - Android Universal Music Player ic_by_genre 不显示

iphone - iPhone SDK:AVAudioPlayer在暂停或结束时发出声音

java - 使用 Java 更改音频输入?

iPhone (iOS4) : is it possible to play music/sound during an active call?

java - 并行运行多个 JPA 事务

java - 如何让信任 anchor 在 Android API 级别 16-19 上正常工作

java - 如何将Guava缓存发送到另一种方法时每30秒清空一次?

objective-c - 使用 CATiledLayer 绘制 Core Data 实体信息时如何正确处理线程