Android - как правильно сделать фоновую многопоточность? - PullRequest
8 голосов
/ 25 января 2010

Интересно, может ли кто-нибудь помочь мне в фоновом потоке на Android.

У меня есть фрагмент кода, который записывает с микрофона устройства, а затем воспроизводит то, что записывает, через наушник (на 1.5).

Я пытаюсь запустить его в потоке, но не получилось запустить его как фоновый поток.

В настоящее время он запускается и блокирует действие, так что все, что происходит, - это поток, выполняемый, и пользовательский интерфейс заблокирован или кажется зависающим.

Вот последний способ, которым я пытался это сделать:

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

Мне было интересно, кто-нибудь может мне помочь, как превратить это в фоновую ветку? Или, возможно, укажет мне на какое-нибудь руководство, которое может быть уместным, которое я, возможно, пропустил?

Заранее спасибо

Ответы [ 2 ]

14 голосов
/ 25 января 2010

Попробуйте вызвать record.start () вместо .run ().

Из Документов API Java :

start () Заставляет этот поток начаться исполнение; виртуальная машина Java вызывает метод run этого потока.

Вы также можете посмотреть AsyncTask .

3 голосов
/ 25 января 2010

Вы не должны вызывать Thread.run, вызывать Thread.start

public void run()

Если эта тема была построен с использованием отдельного Runnable запустить объект, то этот Runnable вызывается метод запуска объекта; в противном случае этот метод ничего не делает и возвращается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...