Android HelloChart 实现输入数据的实时曲线绘制,并保证曲线无卡滞

       最近在忙一个蓝牙通信的项目,需要与下位机实时通信,并要实现在同一界面实现8个chart的同时绘制,通信频率为1秒/次。

一、图表选择

       在项目之初,就预测到卡的问题,因此选择了HelloChart。参考文章:http://blog.csdn.net/u012534831/article/details/51505683。

二、android 布局

       要实现一个界面八个图表的绘制,且x轴范围要求在10min,即600组数据,且一秒钟更新一次,因此选择FragmentPagerAdapter。

三、框架设计

      首先由主Activity接受蓝牙数据,然后通过广播的形式发送给曲线绘制的ChartActivity,ChartActivity通过Handler发送数据给主线程,由主线程更新UI,函数为UpdateUI()。由于数据多,更新频率快,主线程任务过多,因此在主线程需要建立其他线程来辅助更新Chart。由于需要更新8个图表,我就大胆的尝试建立8个子线程。

      由于是刚开始接触Android,走过很多弯路,开始天真的认为采用全局变量可以减少变量的循环赋值,因此很多都采用全局变量,后来发现,程序会卡的非常厉害,甚至莫名闪退。因此开始尝试局部变量,用完之后,直接设置为null,等待android垃圾回收。


四、代码

     下面开始上代码:

4.1 全局变量的声明

ViewPager mViewPager;
ActionBar actionBar= null;
static int pageindex=0;
private static LineChartView lineChartView_O2,lineChartView_NO,lineChartView_NO2,lineChartView_NOx,lineChartView_SO2,lineChartView_CO,lineChartView_H2S,lineChartView_CO2;//ChartView

private static List<PointValue> pointValueListO2,pointValueListNO,pointValueListNO2,pointValueListNOx,pointValueListSO2,pointValueListCO,pointValueListCO2,pointValueListH2S;//点集

private static float mO2Max,mNOMax,mNO2Max,mNOxMax,mCOMax,mCO2Max,mH2SMax,mSO2Max=0;//点集的最小最大值
private static float mO2Min,mNOMin,mNO2Min,mNOxMin,mCOMin,mCO2Min,mH2SMin,mSO2Min=0;
private Thread O2Thread,NOThread,NO2Thread,NOxThread,SO2Thread,COThread,CO2Thread,H2SThread;//线程
Axis axisX = new Axis();
Axis axisY = new Axis().setHasLines(true);
private static int position = 0;
private int refreshRadio=2;//曲线的绘制频率


private static final int xRegion=600;//x轴的范围
private static final int xRegionMax=600;
 
4.2 界面更新,实现数据接受,转化,添加到点集,绘制曲线

private void UpdateUI(byte[] bytes) {//bytes为接受的byte数组
    byte[][] byte4=new byte[8][4];
    float[] tempFloat=new float[8];
    for(int i=0;i<8;i++)//实现从byte数据分割,并转化为float数组
    {
        System.arraycopy(bytes,dStart+i*4,byte4[i],0,4);
        if(i<9) {
            temp=AFactory.ArryToFloat(byte4[i], 0);
            tempFloat[i]= (float)(Math.round(temp*10))/10;//四舍五入保留一位有效数字
        }

    }
    //将新点添加到全局变量
    AndNewPointO2(tempFloat[0]);
    AndNewPointSO2(tempFloat[1]);
    AndNewPointNO(tempFloat[2]);
    AndNewPointNO2(tempFloat[3]);
    AndNewPointNOx(tempFloat[4]);
    AndNewPointCO(tempFloat[
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值