健康宝——呼吸频率部分开发(九)

开发中遇到的问题解决方法


问题:

想实现当第一次呼吸频率测量完再点击按钮可以重复测量时,初步想法时实现两个线程,一个线程倒计时,另一个线程获取当前的分贝值来计算呼吸频率,通过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

你可能感兴趣的:(健康宝——呼吸频率部分开发(九))