永发信息网

bitmapfactory.decodefile是耗时操作吗

答案:2  悬赏:20  手机版
解决时间 2021-02-19 15:17
bitmapfactory.decodefile是耗时操作吗
最佳答案
android 中用bitmap 时很容易内存溢出,报如下错误:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget
● 主要是加上这段:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
● eg1:(通过Uri取图片)
private ImageView preview;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一
Bitmap bitmap = BitmapFactory.decodeStream(cr
.openInputStream(uri), null, options);
preview.setImageBitmap(bitmap);
以上代码可以优化内存溢出,但它只是改变图片大小,并不能彻底解决内存溢出。
● eg2:(通过路径去图片)
private ImageView preview;
private String fileName= "/sdcard/DCIM/Camera/2010-05-14 16.01.44.jpg";
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一
Bitmap b = BitmapFactory.decodeFile(fileName, options);
preview.setImageBitmap(b);
filePath.setText(fileName);
★Android 还有一些性能优化的方法:
● 首先内存方面,可以参考 Android堆内存也可自己定义大小 和 优化Dalvik虚拟机的堆内存分配
● 基础类型上,因为Java没有实际的指针,在敏感运算方面还是要借助NDK来完成。Android123提示游戏开发者,这点比较有意思的是Google推出NDK可能是帮助游戏开发人员,比如OpenGL ES的支持有明显的改观,本地代码操作图形界面是很必要的。
● 图形对象优化,这里要说的是Android上的Bitmap对象销毁,可以借助recycle()方法显示让GC回收一个Bitmap对象,通常对一个不用的Bitmap可以使用下面的方式,如
if(bitmapObject.isRecycled()==false) //如果没有回收
bitmapObject.recycle();
● 目前系统对动画支持比较弱智对于常规应用的补间过渡效果可以,但是对于游戏而言一般的美工可能习惯了GIF方式的统一处理,目前 Android系统仅能预览GIF的第一帧,可以借助J2ME中通过线程和自己写解析器的方式来读取GIF89格式的资源。
● 对于大多数Android手机没有过多的物理按键可能我们需要想象下了做好手势识别 GestureDetector 和重力感应来实现操控。通常我们还要考虑误操作问题的降噪处理。
Android堆内存也可自己定义大小
对于一些大型Android项目或游戏来说在算法处理上没有问题外,影响性能瓶颈的主要是Android自己内存管理机制问题,目前手机厂商对RAM都比较吝啬,对于软件的流畅性来说RAM对性能的影响十分敏感,除了上次Android开发网提到的 优化Dalvik虚拟机的堆内存分配外,我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的 dalvik.system.VMRuntime类来设置最小堆内存为例:
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理,我们将在下次提到具体应用。
优化Dalvik虚拟机的堆内存分配
对于Android平台来说,其托管层使用的Dalvik JavaVM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用 dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法: private final static floatTARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就可以调用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。
全部回答
是不是创建模拟器时候忘记给sd卡设置内存了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
山东兴润实业有限公司在哪里啊,我有事要去这
晶体管非门电路如图所示,已知。当输入电压U=
早上清洁微信。弄掉了。我想恢复。怎么办
汽车中控锁失灵原因
沧州市道教协会怎么去啊,有知道地址的么
下面哪一项不属于影响人们快乐与否的因素
单相感应电容式电动机工作原理是什么?
四川广元最好的小学有哪些
网易帐号被锁定了,如何解锁?
圆的周长和面积怎么算(半径是两厘米的)
叶子像鹅掌柴,但叶片很厚的植物叫什么名字
老村长酒业江阴办事处这个地址在什么地方,我
2的倍数有那些特征什么是偶数什么是奇数
冒险岛怎么设置技能组合啊
朱熹是什么人?
推荐资讯
谁给我几对春联
一台路由器只分10条分线,为什么电脑主机里有
无线摄像头能注册二个用户吗?就想二个手机号
庆云村民在滨州附属医院手术后需在哪里报销,
g316高铁上有没有母婴室
百色到隆林的高速公路什么时候可以通车
【声望】名望.威望.声望这3个词语分别是什么
森嘉林地板我想知道这个在什么地方
求日语歌名字 以sayonala开头的,挺伤感的。
常相思,心莫弃。遥星望,莫相依。 按照这个
一个圆直径符号Φ 怎么打出来呢?
渲染 cpu1700x和6800k哪个好
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?