美文网首页
健康宝——呼吸频率部分开发(九)

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

作者: garlic_666 | 来源:发表于2017-09-03 23:03 被阅读0次

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


    问题:

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

    相关文章

      网友评论

          本文标题:健康宝——呼吸频率部分开发(九)

          本文链接:https://www.haomeiwen.com/subject/xmcsjxtx.html