红外项终于告一段落了,趁着空闲时间,特来总结一番。
项目介绍
通过wifi连接热像仪(设备),连接成功后每隔5s向热像仪发送心跳包,同时接受热像仪发送的心跳包。通过一些指令,实现对热像仪进行调焦,温度校正、电子变倍、设备抓图、实时监控(实时视频播放)等操作,也可通过指令将热像仪抓的图和录制的视频下载到本地,进行一系列的分析操作。
内存溢出分析总结
开发项目中遇到的最让人头疼的问题,莫过于内存溢出了。由于项目中大量涉及到了对byte数组的使用(拷贝,拼接、查找)等,一不小心就outofmemory了。总结出需要注意以下两个知识点的使用
1> 多线程中锁的使用----项目中接收数据和处理数据是在不同线程里处理的,没加锁使得后面的数据处理不对,数据不能够及时被释放掉,导致用于存放数据的byte数组无限增大……
2>内存分析工具的使用(MAT),在android studio中,点击monitor,先initiate GC,然后Start Allocation Tracking,最后Dump java Heap.在项目captures下会生成分析的hPRof(Dalvik格式)文件,将该文件通过android sdk下的hprof-conv.exe 执行hprof-conv dump.hprof converted-dump.hprof,从Dalvik格式转换成J2SE HPROF格式,最后使用下载的MemoryAnalyzer.exe工具打开hprof文件进行分析【使用代码成功hprof文件链接:http://blog.csdn.net/sodino/article/details/38512473】
知识点总结
1、socket使用----项目里使用的是原始(一开始打算使用netty框架进行socket编程,但由于项目本身的特殊性[接收到的是原始的byte字节,没有标识长度],最终放弃使用)
2、byte使用 byte范围-128-127,byte转换成int 需要使用google的无符号转换方法 UnsignedBytes.toInt() ---compile 'com.google.guava:guava:20.0'
2、litepal数据库使用,该开源框架使用起来特别方便,采用了对象关系映射(ORM)的模式,对数据库常用的方法进行了封装,无需用户编写sql语句------compile 'org.litepal.android:core:1.3.2'
3、surfaceview使用,注意点【1】:surfaceview设置背景不可再xml里设置会导致更新界面无效,可在callback的surfaceCreated方法中绘制背景色【2】:切换surfaceview大小时会出现黑边,需要在callback的surfaceChanged回调中设置setFixedSize(width, height); 【3】:布局里包含surfaceview,使用getDrawingCache截图,会导致截图失败
4、曲线绘制--achartengine使用---compile files('libs/achartengine-1.2.0.jar')
5、范围选择控件--rangeseekbar使用 ---
compile 'com.yahoo.mobile.client.android.util.rangeseekbar:rangeseekbar-library:0.1.0'
6、图形(点、线、圆、矩形)添加,放大缩小,移动操作
7、系统方法使用:数组合并:System.arraycopy(Object src, int srcPos, Object dst, int dstPos, int length)
数组截取:Arrays.copyOfRange(byte[] original, int start, int end)
8、创建文件夹,File dir = new File(saveDir)在android高版本手机上创建失败 if (!dir.exists()) { dir.mkdirs(); }
需改为 String[] path = filePath.split("/"); for (int i = 0; i < path.length; i++) { if (newPath == null) { newPath = path[i]; } else { newPath = newPath + "/" + path[i]; } file = new File(newPath); if (!file.exists()) { file.mkdir(); } }
新闻热点
疑难解答