要点:
1、用decodeFileDescriptor()来生成bimap比decodeFile()省内存,将
Bitmap bmp = BitmapFactory.decodeFile(imageFile, opts); imageView.setImageBitmap(bmp);
替换为
1 FileInputStream is = = new FileInputStream(path); 2 bmp = BitmapFactory.decodeFileDescriptor(is.getFD(), null, opts);
原因:
查看BitmapFactory的源码,对比一下两者的实现,可以发现decodeFile()最终是以流的方式生成bitmap
decodeFile源码:
1 public static Bitmap decodeFile(String pathName, Options opts) { 2 Bitmap bm = null; 3 InputStream stream = null; 4 try { 5 stream = new FileInputStream(pathName); 6 bm = decodeStream(stream, null, opts); 7 } catch (Exception e) { 8 /* do nothing. 9 If the exception happened on open, bm will be null. 10 */ 11 } finally { 12 if (stream != null) { 13 try { 14 stream.close(); 15 } catch (IOException e) { 16 // do nothing here 17 } 18 } 19 } 20 return bm; 21 }
decodeFileDescriptor的源码,可以找到native本地方法decodeFileDescriptor,通过底层生成bitmap
decodeFileDescriptor源码:
1 public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) { 2 if (nativeIsSeekable(fd)) { 3 Bitmap bm = nativeDecodeFileDescriptor(fd, outPadding, opts); 4 if (bm == null && opts != null && opts.inBitmap != null) { 5 throw new IllegalArgumentException("Problem decoding into existing bitmap"); 6 } 7 return finishDecode(bm, outPadding, opts); 8 } else { 9 FileInputStream fis = new FileInputStream(fd); 10 try { 11 return decodeStream(fis, outPadding, opts); 12 } finally { 13 try { 14 fis.close(); 15 } catch (Throwable t) {/* ignore */} 16 } 17 } 18 } 19 20 private static native Bitmap nativeDecodeFileDescriptor(FileDescriptor fd,Rect padding, Options opts);
具体的牵扯到底层虚拟机,目前我也给不了合理解释,各位朋友有好的解释留言
时间: 2024-11-01 03:47:56