开发中遇到的问题解决方法
问题:
想实现当第一次呼吸频率测量完再点击按钮可以重复测量时,初步想法时实现两个线程,一个线程倒计时,另一个线程获取当前的分贝值来计算呼吸频率,通过handler的sendMessage方式来控制线程的执行流程,结果页面倒计时出现问题,会有两个线程重复进行计时或者计时不精确
初步实现的核心代码:
handler部分:
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what){
case TEST_START:
if(isBegin)
{
if(!isTesting)
{
isTesting = true;
new Thread(new stopRun()).start();
new Thread(new blowRun()).start();
}
}
break;
case TESTING:
recordTV.setText("倒计时"+utilEnd+"秒");
soundDiscView.refresh();
break;
case TESTEND:
int avg = sum/200;
for (int i=1;i<199;i++)
{
if(sampleValue[i]>avg&&sampleValue[i]>sampleValue[i-1]&&sampleValue[i]>sampleValue[i+1])
frequency++;
}
recordTV.setText("您的呼吸频率为"+frequency*3+"次每分钟");
mBlowBtn.setText("测试完成");
// mBlowBtn.setEnabled(true);
break;
}
return false;
}
}) ;
计时线程代码:
class stopRun implements Runnable{
@Override
public void run() {
while(!isPause)
{
try{
Thread.sleep(1000);
utilEnd--;
// handler.sendEmptyMessage(TESTING);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(utilEnd == 0)
{
isBegin = false;
isTesting = false;
// mRecorder.stopRecording();
handler.sendEmptyMessage(TESTEND);
}
}
}
}
计算呼吸频率代码:
class blowRun implements Runnable{
@Override
public void run() {
while(!isPause && isTesting)
{
volume = mRecorder.getMaxAmplitude(); //获取声压值
if(volume > 0 && volume < 1000000) {
World.setDbCount(20 * (float)(Math.log10(volume))); //将声压值转为分贝值
int temp = (int)World.dbCount;
if(count<200)
{
sampleValue[count] = temp;
sum = sum + temp;
}
System.out.print("temp:"+temp + " ");
count++;
System.out.print("count:"+count+ " ");
}
try{
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendEmptyMessage(TESTING);
}
if(!isTesting)
{
handler.sendEmptyMessage(TESTEND);
}
}
}
}
解决方法:
经过观察发现初步想法很可能会造成两个计时线程同时运行,所以改为使用Runnabe来实现,这样运行一次,handler中的线程就会清空一次,详细实现见http://www.jianshu.com/p/0be864a2d274
网友评论