㈠ android 內存溢出和內存泄漏的區別
內存溢出是指當對象的內存佔用已經超出分配內存的空間大小,這時未經處理的異常就會拋出。比如常見的內存溢出情況有:bitmap過大;引用沒釋放;資源對象沒關閉
如圖,這是使用MAT工具查找內存泄漏的結果,例子是 handle 延時發送 message 而在關閉 activity 後 context 被銷毀所引發的泄漏,這是作為目的性的測試所以問題比較容易找到,在實際開發中內存泄漏不易察覺並難以找到,當泄漏累積到一定程度是會引發 OOM 的。
㈡ opencv4android 中的2個Mat(Mat的值為2個Bitmap)如何變成一個Mat(即圖片融合)
用Core裡面的add或者addweighted來寫
㈢ android bitmap 圖片縮放問題
在使用Bitmap進行點陣圖讀取和顯示的時候需要注意在生成點陣圖時,系統會根據不同的情況來縮小、放大圖像。
當把圖片放到drawable文件夾中時,160密度的模擬器顯示的圖像有放大效果,240密度的模擬器顯示原尺寸的圖像。
當把圖片放到drawable-hdpi文件夾中時,160密度的模擬器顯示出的圖像有縮小效果,240密度的模擬器顯示原尺寸的圖像。
當把圖片放到drawable-mdpi文件夾中時,160密度的模擬器顯示原尺寸的圖像,240密度的模擬器顯示放大的圖像。
當把圖片放到drawable-ldpi文件夾中時,160、240密度的模擬器都顯示放大的圖片。
由此可以看出,在使用Bitmap顯示圖像時,一般應放在drawable-hdpi文件夾中,這樣可以根據屏幕的密度來調整圖像大小,比如再做游戲時,大屏幕的與小屏幕的手機中,人物或物體應該有大小之分。望求採納謝謝...
㈣ android開發怎麼實現拍照上傳
這個其實是一個很泛的問題
我大致說下我的思路:
用startactivityforresult方法調用系統的攝像頭,隨便拍張照片,把照片保存在某一目錄下面
點擊完成後,會在onactivityresult中,根據目錄的地址,再把這目錄下面的資源得轉換為文件,接著通過介面進行提交。提交成功後,後台返回一個URL。
通過這個URL,運用imageload(第三方插件)顯示圖片
㈤ android 性能優化有哪些辦法
性能優化的常用方法
主要內容包括布局優化,繪制優化,內存泄露優化,相應速度優化,ListView優化,Bitmap優化,線程優化等,下面主要給你舉了其中的幾個例子:
(1)布局優化
布局優化的思想很簡單,就是盡量減少布局文件的層級。
如何進行優化呢?首先刪除布局中無用的控制項和層級,其次有選擇地使用性能較低的ViewGroup,比如LinearLayout。如果布局中有的布局既可以用LinearLayout也可以用RelativeLayout,那就用LinearLayout,這是因為RelativeLayout比較復雜,他的布局過程花費更多的CPU時間。FrameLayout和LinearLayout一樣都是一種簡單高效的ViewGroup,因此可以考慮使用他們,但是很多時候,單純的通過一個LinearLayout或者FrameLayout無法實現產品的效果,需要通過嵌套的方式來完成,這種情況建議採用RelativeLayout,因為ViewGroup的嵌套就相當於增加了布局的層級,同樣會降低程序的性能。
布局優化的另一種手段是採用<include>標槍,<merge>標簽和ViewStub。<include>標簽主要用於布局重用,<merge>標簽一般和<include>配合使用,它可以減少布局的層級。而ViewStub則提供了按需載入功能,當需要時才將ViewStub中的布局載入到內存,這提高了程序的初始化效率。
(2)繪制方法
繪制優化是指View的onDraw方法避免執行大量的操作,這主要有兩方面。
首先,onDraw中不要創建新的布局對象,這是因為onDraw方法可能會被頻繁調用,這樣就會在一瞬間產生大量的臨時對象,這不僅佔用了過多的內存而且還會導致系統更加頻繁的gc,降低了程序的執行效率。
另一方面,onDraw方法中不要做耗時的任務,也不能執行成千上萬次循環操作,盡管每次循環都很輕量級,但是大量的循環仍然十分搶佔CPU的時間片,這會造成View的繪制過程不流暢。
(3)內存泄露優化
內存泄露在開發過程中是一個需要重視的問題,但是由於內存泄露問題對開發人員的經驗和開發意識要求比較高,因此這是開發人員最容易犯的錯誤之一。內存泄露的優化分為兩個方面,一方面是在開發過程中避免寫出內存泄露的代碼,另一方面通過一些分析工具比如MAT來找出潛在的內存泄露繼而解決。
關於性能優化的建議
1.避免黃健過多對象;
2.不要過多使用枚舉,枚舉佔用的內存空間比整型大一些。
3.常量使用staticfinal來修飾。
4.使用一些Android特有的數據結構,比如SpareArray和Pair等,他們都具有更好的性能。
5.適當使用軟引用和弱引用。
6.採用內存緩存和磁碟緩存
7.盡量採用靜態內部類,這樣可以避免潛在的內部類而導致的內存泄漏。
㈥ 快速定位 android內存泄漏具體類的位置
在 java中,JavaVM擁有自動管理內存的功能,Java的GC能夠進行垃圾回收,但是Android中如果ImageView使用過多的Bitmap的話,經常會報OOM(內存溢出)。造成內存溢出及解決方案:
1.使用BitmapFactory.decodeStream替代createBitmap方法
原因是該方法直讀取圖片位元組,調用JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap。
2.使用壓縮讀取技術
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imageSdUri, options);
final int height = options.outHeight;
final int width = options.outWidth;
options.inSampleSize = 1;
int w = 320;
int h = 480;
h = w*height/width;//計算出寬高等比率
int a = options.outWidth/ w;
int b = options.outHeight / h;
options.inSampleSize = Math.max(a, b);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(imageSdUri, options);3.及時釋放Bitamp
Bitmap對象在不使用時,我們應該先調用recycle()釋放內存,然後才它設置為null.雖然recycle()從源碼上看,調用它應該能立即釋放Bitmap的主要內存,但是測試結果顯示它並沒能立即釋放內存。但是我它應該還是能大大的加速Bitmap的主要內存的釋放。
㈦ 導致android內存泄漏原因有哪些
Android應用內存泄漏的的原因有以下幾個:
1查詢資料庫後沒有關閉游標cursor
2 構造Adapter時,沒有使用 convertView 重用
3 Bitmap對象不在使用時調用recycle()釋放內存
4 對象被生命周期長的對象引用,如activity被靜態集合引用導致activity不能釋放
內存泄漏的發現:
通過DDMS中的heap工具,去發現是否有內存溢出。
內存泄漏如何解決:
通過內存分析工具 MAT(Memory Analyzer Tool),找到內存泄露的對象
㈧ 如何用MAT分析Android應用內存泄露
Android應用內存泄漏的的原因有以下幾個:1查詢資料庫後沒有關閉游標cursor2構造Adapter時,沒有使用convertView重用3Bitmap對象不在使用時調用recycle()釋放內存4對象被生命周期長的對象引用,如activity被靜態集合引用導致activity不能釋放內存泄漏的發現:通過DDMS中的heap工具,去發現是否有內存溢出。內存泄漏如何解決:通過內存分析工具MAT(MemoryAnalyzerTool),找到內存泄露的對象
㈨ Opencv4Android NDK,JNI調用C++函數,對象類型參數轉換問題
Mat傳地址過去
java中:
Mat src = new Mat();
Utils.bitmapToMat(bmp, src);
long addrMat = src.getNativeObjAddr();
在C++中:
Mat& finger_src = *(Mat *)addrMat;
至於Point2f 數組可拆為X坐標和Y坐標數組
Point2f mask[15], float width[15]直接傳 jfloatArray width, jfloatArray maskX, jfloatArray maskY
獲取
jfloat *arr, *mx, *my;
arr = env->GetFloatArrayElements(width,JNI_FALSE);
mx = env->GetFloatArrayElements(maskX,JNI_FALSE);
my = env->GetFloatArrayElements(maskY,JNI_FALSE);
/******** 轉為C++類型 進行處理 **********/
Point2f mask[16]; //坐標
float fingerWidth[15]; //寬度
for(int i=0;i<15;i++){
mask[i].x = mx[i];
mask[i].y = my[i];
fingerWidth[i] = arr[i];
}
/************************** 結果返回java ************************************/
for(int i=0;i<15;i++){
mx[i] = mask[i].x;
my[i] = mask[i].y;
arr[i] = fingerWidth[i];
}