2012-05-31 3 views
5

Итак, для фона я пытаюсь создать приложение, которое непрерывно записывает данные через микрофон и сохраняет данные в буфере. Целью программы было бы выполнять некоторый тип обработки данных в буфере и воздействовать на него. В настоящее время приложение просто считывает данные в буфер и записывает их как можно скорее. При запуске приложения вы говорите в микрофон, а затем слышите, что вы только что говорили, выходят на другой конец.Как остановить/запустить службу, содержащую бесконечный цикл при создании

Теперь вот где моя неопытность с Android начинает поднимать голову. Я выполняю операцию чтения и записи как бесконечный цикл. Сервис находится ниже:

public class AudioService extends Service { 

private final int MIC = AudioSource.MIC; 
private final int SAMPLE = 44100; 
private final int CHANNELI = AudioFormat.CHANNEL_IN_MONO; 
private final int CHANNELO = AudioFormat.CHANNEL_OUT_MONO; 
private final int FORMAT = AudioFormat.ENCODING_PCM_16BIT; 
private final int BUFFERSIZE = AudioRecord.getMinBufferSize(SAMPLE, 
     CHANNELI, FORMAT); 
private final int STREAM = AudioManager.STREAM_MUSIC; 
private final int MODE = AudioTrack.MODE_STREAM; 
private boolean play = true; 

AudioRecord recorder = null; 
AudioTrack track = null; 

short[] buffer = null; 

public void OnCreate() { 

} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    recorder = new AudioRecord(MIC, SAMPLE, CHANNELI, FORMAT, BUFFERSIZE); 
    track = new AudioTrack(STREAM, SAMPLE, CHANNELO, FORMAT, BUFFERSIZE, 
      MODE); 
    buffer = new short[BUFFERSIZE]; 
    recorder.startRecording(); 
    track.play(); 

    while (play) { 
     recorder.read(buffer, 0, buffer.length); 
     track.write(buffer, 0, buffer.length); 
    } 
    return START_STICKY; 
} 

Эта услуга вызывается, когда нажата кнопка «Запись» в действии. Я хочу, чтобы иметь возможность щелкнуть запись и иметь возможность щелчка отменить, чтобы остановить этот цикл. Нижеприведенный слушатель:

private OnClickListener Recording = new OnClickListener() { 
    public void onClick(View v) { 

     serviceIntent = new Intent(getApplicationContext(), 
       AudioService.class); 
     serviceIntent.putExtra("extraData", "somedata"); 
     startService(serviceIntent); 

     record.setEnabled(false); 
     cancel.setEnabled(true); 
     cancel.requestFocus(); 

}; 

И теперь проблема становится очевидной. Приложение не может завершить выполнение, когда оно достигает startService (serviceIntent), и просто зависает в балансе.

Итак, каково мое обращение? Я думал о каком-то способе управления сервисом из бесконечного цикла, но моя неопытность с Android оставляет мне интересно, как это сделать. Подстрекать какой-то способ сломаться, возможно, создавая новую кнопку внутри цикла; поэтому во время startIntent я смог бы вырваться из цикла и «закончить безумие».

Любая помощь будет оценена по достоинству. Я также понимаю, что эта служба должна запускаться в отдельном потоке из пользовательского интерфейса, чтобы избежать проблемы «Приложение не отвечает ...», но это своего рода другая тема. Моя главная цель прямо сейчас - выйти из цикла, и я буду признателен за любую помощь или руководство о том, как это сделать.

ответ

4

Услуга ниже

Проблема № 1: Вы не имеете никакого способа выхода из вашего цикла.

Проблема №2: Ваша петля работает в основной прикладной нити.

Это плохо.

Итак, каков мой регресс?

Вы кладете бесконечный цикл в фоновом потоке, используя что-то (например, AtomicBoolean), чтобы сказать, что нить, чтобы остановить, когда это необходимо (например, onDestroy()).

Я также понимаю, что эта служба должна запускаться в отдельном потоке из пользовательского интерфейса, чтобы избежать проблемы «Приложение не отвечает ...», но это своего рода другая тема.

Нет, это та же тема.

Разжигание каким-то образом разорвать на возможно инстанцировании новую кнопку внутри цикла

услуги не имеют пользовательского интерфейса.

Поскольку у вас есть кнопка «запись» в этом действии, которая вызывает вызов startService(), тогда, возможно, эта операция должна иметь кнопку «Стоп», которая вызывает вызов stopService().

После того, как вы определить, где и как позвонить stopService(), то все, что вам нужно сделать, это получить onDestroy() вашей службы, чтобы вызвать ваш фоновый поток остановить работу, так как onDestroy() будет вызван вызовом stopService().

+0

Отлично! Я получу работу по перемещению цикла в фоновый поток. Существует кнопка отмены, целью которой было остановить все это, но я продолжал повесить трубку после нажатия на «Запись». Благодаря! – user1429581

Смежные вопросы