Android应用程序挂起,有时会出现强制关闭/等待对话框

时间:2010-12-19 12:11:43

标签: android freeze

我正在创建一个记录未压缩(wav格式)音频的应用。我正在使用this class来实际录制音频。目前,我的应用程序记录正常(我可以播放文件),但是当我点击按钮停止录制时,应用程序会挂起10秒左右,没有日志输出或任何生命迹象。最后它绕过,将大量错误转储到日志中,更新UI等。我正在使用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,仍然不起作用,当我点击记录时应用程序完全挂起,尽管事实上Log表明主线程中没有任何内容。仍然完全难倒。

3 个答案:

答案 0 :(得分:2)

您是否已获得应用程序RECORD_AUDIO权限?

您还应该更改RehearsalAudioRecorder中的catch-block以记录真正的异常,而不仅仅是“updateListener中出现错误,记录已中止”,因为它现在记录。

答案 1 :(得分:0)

Fredley,

解决此问题的最简单方法是检查onPeriodicotification中aRecorder的状态。您可以通过在以下if语句中嵌套所有内容来完成此操作:


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

注意:这是必要的,因为除了其他AsyncTasks之外,AudioRecord对象必须是线程化的。您的状态根本不够,因为AudioRecord对象无法访问它。

模糊逻辑

P.S。您也可以根据记录器参数验证aRecord对象。他们没有保证与同一个对象交谈。对于这个特定的代码并不重要,但对未来很有帮助。

答案 2 :(得分:0)

将其置于服务中,完全摆脱了UI锁定。我在RehearsalAudio项目中使用了一个严重剥离的RecordService类版本,删除了所有不需要的会话内容。