㈠ 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];
}