使用AudioRecord录音时,需要在UI线程的StopRecord方法、数据读取线程的while代码块之间加上锁,我使用了synchronized(byte[])。 但是按下停止录音按钮之后,StopRecord被阻塞了,while代码块却仍然在循环执行。
下面是抽象出来的简单代码,可以直接运行,同样出现了UI线程阻塞但无法获取锁的结果:
public class MainActivity extends ActionBarActivity implements View.OnClickListener{
final byte[] lock = new byte[0];
boolean isRecording = false;
RecorderThread recorderThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button buttonStart = (Button)findViewById(R.id.button_start);
Button buttonStop = (Button)findViewById(R.id.button_stop);
buttonStart.setOnClickListener(this);
buttonStop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button_start:
if(!isRecording){
// Initialize AudioRecord and startRecording
isRecording = true;
recorderThread = new RecorderThread();
recorderThread.start();
}
break;
case R.id.button_stop:
if(isRecording){
synchronized (lock){
// Stop AudioRecord and release
isRecording = false;
}
}
break;
}
}
private class RecorderThread extends Thread{
@Override
public void run() {
while (isRecording){
synchronized (lock){
try{
// AudioRecord.read()
Thread.sleep(200);
Log.d("TAG","read a sample data");
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
}
}
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
ringa_lee