紅外項終于告一段落了,趁著空閑時間,特來總結一番。
項目介紹
通過wifi連接熱像儀(設備),連接成功后每隔5s向熱像儀發送心跳包,同時接受熱像儀發送的心跳包。通過一些指令,實現對熱像儀進行調焦,溫度校正、電子變倍、設備抓圖、實時監控(實時視頻播放)等操作,也可通過指令將熱像儀抓的圖和錄制的視頻下載到本地,進行一系列的分析操作。
內存溢出分析總結
開發項目中遇到的最讓人頭疼的問題,莫過于內存溢出了。由于項目中大量涉及到了對byte數組的使用(拷貝,拼接、查找)等,一不小心就outofmemory了??偨Y出需要注意以下兩個知識點的使用
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)
數組截?。篈rrays.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(); } }
新聞熱點
疑難解答