最近在忙一个蓝牙通信的项目,需要与下位机实时通信,并要实现在同一界面实现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[