安卓读取sd卡图片问题
安卓读取sd卡图片内存溢出一直是个老问题。网上几种常用的解决方法也都了解。使用了软引用SoftReference,同时我手工也很注意释放内存,同一个时刻我只保存2张图片在内存中,图片一用过就recycle().但还是内存偏高。使用
System.out.println("freememory:"+Runtime.getRuntime().freeMemory());
System.out.println("totalmemory:"+Runtime.getRuntime().totalMemory());
System.out.println("maxmemory:"+Runtime.getRuntime().maxMemory()); 查看,
运行稳定期内存都还要达到:
freememory:14695760
totalmemory:64954336
maxmemory:67108864
目前我的图片都是在sd卡中,无法使用网上普遍流行的从资源文件里读取图片到流中,
然后从流中读取到bitmap里的方法
即无法使用这种方式:
public static Bitmap readBitmap(int resid){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
InputStream input = getResources().openRawResource(resid);
return BitmapFactory.decodeStream(input,null,opt);
}
或
String path = "com/xiangmu/test.png";
InputStream is = getClassLoader().getResourceAsStream(path);
这种方式
直接从sd卡中读取图片又发现内存占用太大
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/1.png");
不得不解释的是,我不想降低图片的分辨率,目前我大概一张图片1.1M这样,我同一时间在内存里也
只会保有2张
从传智博客一个例子代码看到,有人这么写
public static Bitmap getImage(String address) throws Exception{
File file = new File(address);
FileInputStream fis = new FileInputStream(file);//fis.
byte[] imagebytes = getBytes(fis);
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig=Bitmap.Config.RGB_565;
opt.inInputShareable=true;
opt.inPurgeable=true;//设置图片可以被回收
Bitmap bitmap = BitmapFactory.decodeByteArray(imagebytes, 0, imagebytes.length,opt);
return bitmap;
}
public static byte[] getBytes(InputStream in) throws Exception {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
in.close();
bos.flush();
byte[] result = bos.toByteArray();
return result;
}
貌似是从流中读取图片到bitmap,好像降低了一点内存使用量,但还是很高
想问问大家,从sd卡中读取图片到内存里,有没有什么好的方法避免OOM --------------------编程问答-------------------- 顶一下,防沉 --------------------编程问答-------------------- 再顶一下,防沉 --------------------编程问答-------------------- 图片过大,bitmap有读取图片大小限制,你可以把图片换小点的试试就知道了。 --------------------编程问答--------------------
难道面对仅仅1M的图片不降分辨率的话我们就束手无策吗? --------------------编程问答-------------------- 超过规定大小了,其实你不用jepg,用png分辨率一样,图片却小的多,,, --------------------编程问答-------------------- 除 --------------------编程问答-------------------- decode的时候是看图片尺寸的,和图片大小没关系,你缩放下图片的尺寸就ok了 --------------------编程问答-------------------- 一定要控制大小,小心oom
补充:移动开发 , Android