将AudioRecord.getState()放入循环中是否有用?

时间:2013-02-26 05:15:41

标签: java android

我正在使用一些调用AudioRecord构造函数的代码:

AudioRecord listener = new AudioRecord(list of parameters);
do {} while (listener.getState() != AudioRecord.STATE_INITIALIZED);

如果AudioRecord在另一个线程中关闭并且需要时间来初始化,则此代码似乎有意义。我不确定是不是这样,如果不是这样,让代码只检查并返回异常似乎要好得多,以免在初始化确实失败的某个时刻启动无限循环(虽然我可以将支票数量限制在有限的范围内。)

我应该按原样保留代码,还是用以下内容替换第二行?

if(listener.getState() != AudioRecord.STATE_INITIALIZED) {
    throw new Exception("AudioRecord failed to initialize");
}

2 个答案:

答案 0 :(得分:3)

当您查看源代码时,将会非常清楚:

public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, 
            int bufferSizeInBytes)
    throws IllegalArgumentException {   
        mState = STATE_UNINITIALIZED;
        mRecordingState = RECORDSTATE_STOPPED;

        ... //parameter checks

        // native initialization
        //update native initialization when information about hardware init failure
        //due to capture device already open is available.
        int initResult = native_setup( new WeakReference<AudioRecord>(this), 
                mRecordSource, mSampleRate, mChannels, mAudioFormat, mNativeBufferSizeInBytes);
        if (initResult != SUCCESS) {
            loge("Error code "+initResult+" when initializing native AudioRecord object.");
            return; // with mState == STATE_UNINITIALIZED
        }

        mState = STATE_INITIALIZED;
    }

所以你不必等待状态转换。您只需在调用构造函数一次后检查状态。如果native_setup中有任何错误,则状态为STATE_UNINITIALIZED。

答案 1 :(得分:1)

我想说抛出异常。我有一个使用AudioRecord的应用程序&gt; 1000000下载,它不必等待AudioRecord状态。 (并且你至少需要在你的while循环中使用Thread.sleep()来确保在等待AudioRecord的时候不要消耗100%的cpu,如果你确实需要这样做的话。)