我正在使用一些调用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");
}
答案 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,如果你确实需要这样做的话。)