Приложение Android зависает, иногда до появления диалогового окна Force Close / Wait - PullRequest
1 голос
/ 19 декабря 2010

Я делаю приложение, которое записывает несжатый звук (в формате WAV).Я использую этот класс для записи звука.В настоящее время мое приложение записывает нормально (я могу воспроизвести файл), однако, когда я нажимаю кнопку, чтобы остановить запись, приложение зависает на 10 секунд или около того, без вывода журнала или каких-либо признаков жизни.Наконец, он возвращается, выдает множество ошибок в журнал, обновляет пользовательский интерфейс и т. Д. Я использую AsyncTasks, чтобы попытаться избежать такого рода вещей, но это не работает.Вот мой код:

//Called on clicks of the record button. rar is the instance of RehearsalAudioRecorder

private OnClickListener RecordListener = new OnClickListener(){

        @Override
        public void onClick(View v) {
            Log.d("Record","Click");
            if (recording){
                new stopRecordingTask().execute(rar,null,null);
                startStop.setText("Record");
                statusBar.setText("Recording Finished, ready to Encode");

            }else{
                recording = true;
                new startRecordingTask().execute(rar,null,null);
                startStop.setText("Stop");
                statusBar.setText("Recording Started");
            }

        }

    };
private class startRecordingTask extends AsyncTask<RehearsalAudioRecorder,Void,Void>{
        @Override
        protected Void doInBackground(RehearsalAudioRecorder... rs) {
            RehearsalAudioRecorder r = rs[0];
            r.setOutputFile("/sdcard/rarOut.wav");
            r.prepare();
            r.start();
            return null;
        }

    }
    private class stopRecordingTask extends AsyncTask<RehearsalAudioRecorder,Void,Void>{
        @Override
        protected Void doInBackground(RehearsalAudioRecorder... rs) {
            RehearsalAudioRecorder r = rs[0];
            r.stop();
            r.reset();
            return null;
        }

    }

В Logcat я всегда получаю вывод, подобный этому, что ставит меня в тупик.Я понятия не имею, что это вызывает (я регистрирую класс RehearsalAudioRecorder, и он запускается / останавливается правильно нажатием кнопки. Этот вывод происходит после вывода журнала для нажатия кнопки и правильного вызова метода stop ())

12-19 11:59:11.172: ERROR/AudioRecord-JNI(22662): Unable to retrieve AudioRecord object, can't record
12-19 11:59:11.172: ERROR/uk.ac.cam.tfmw2.steg.RehearsalAudioRecorder(22662): Error occured in updateListener, recording is aborted
12-19 11:59:11.172: ERROR/uk.ac.cam.tfmw2.steg.RehearsalAudioRecorder(22662): stop() called on illegal state: STOPPED
12-19 11:59:11.172: ERROR/AudioRecord-JNI(22662): Unable to retrieve AudioRecord object, can't record
12-19 11:59:11.172: ERROR/uk.ac.cam.tfmw2.steg.RehearsalAudioRecorder(22662): Error occured in updateListener, recording is aborted
12-19 11:59:11.172: ERROR/uk.ac.cam.tfmw2.steg.RehearsalAudioRecorder(22662): stop() called on illegal state: ERROR
12-19 11:59:11.172: ERROR/AudioRecord-JNI(22662): Unable to retrieve AudioRecord object, can't record
12-19 11:59:11.172: ERROR/uk.ac.cam.tfmw2.steg.RehearsalAudioRecorder(22662): Error occured in updateListener, recording is aborted
12-19 11:59:11.172: ERROR/uk.ac.cam.tfmw2.steg.RehearsalAudioRecorder(22662): stop() called on illegal state: ERROR
... 10 or more times

Я возился с этим весь день, и я никуда не денусь, любой вклад будет принят с благодарностью.

Обновление Я заменил AsyncTasksПотоки по-прежнему не работают, приложение полностью зависает, когда я нажимаю на запись, несмотря на то, что журнал указывает, что в основном потоке ничего не происходит.Все еще в полном замешательстве.

Ответы [ 3 ]

2 голосов
/ 19 декабря 2010

Вы дали приложению разрешение RECORD_AUDIO?

Вы также должны изменить блок catch в RehearsalAudioRecorder, чтобы регистрировать реальное исключение, вместо того, чтобы просто «Произошла ошибка в updateListener, запись прервана», поскольку теперь она регистрируется.

0 голосов
/ 30 декабря 2010

Помещение в Службу работает, полностью избавляет от блокировки пользовательского интерфейса. Я использовал сильно урезанную версию класса RecordService в проекте RehearsalAudio, удалив все ненужное для сеанса.

0 голосов
/ 26 декабря 2010

Fredley,

Самый простой способ исправить это - проверить состояние aRecorder в вашей onPeriodicotification. Вы можете сделать это, вложив все в следующее выражение if:


if (aRecord.getRecordingState() != RECORDSTATE_STOPPED)
{
   // Your onPeriodicNotification code here...
}

Примечание. Это необходимо, потому что объект AudioRecord обязательно имеет резьбу в дополнение к другим AsyncTasks. Вашего состояния просто недостаточно, потому что оно недоступно для объекта AudioRecord.

Нечеткая логика

P.S. Вы также можете проверить свой объект aRecord по аргументу вашего рекордера. Они не застрахованы, чтобы говорить с тем же объектом. Не важно для этого конкретного кода, но полезно знать на будущее.

...