http://phenom.iteye.com/blog/1541291
(DOC)Displaying Bitmaps Efficiently
这篇是翻译的,
此次是实践,是关于Android系统的图片解码的实例
文中说到:
摄像头在GalaxyNexus拍一张照片有2592*1936像素,如果bitmap使用ARGB_8888配置(2.3默认的),加载这张照片到内存需要消耗约19mb内存,(2592*1936*4bytes)
19m的内存对模拟器的16m来说,显然太大了,但对于真实的机器 ,还是可以的
至于说Android的图片内存8m,这个不知道是听谁说的,总之我也没有找到标准的答案,有可能是在Android刚出来的时候定义的一个堆大小,我觉得最有可能的是这个值作为图片解码的内存大小,却不是对图片的大小限制的.所以上面的图片是可以解码显示出来的.
先说下情况:
一张440*17514大小的图片,直接在galaxy上解析,然后得到Bitmap,再放到ImageView中显示,一切正常的.说下galaxy的情况:
/system/build.prop中的heapsize=64m
两种方法,一种是argb_8888配置,一种 是rgb_565
实践也表明了,两种图片解码后的效果差不多的,如果不是图像处理,完全可以用rgb_565来处理图片的显示,
显然这张图片解析需要29m左右的内存,<64m.所以我觉得Android的内存限制不是只是图片上,而是整个进程的,当进程占用的内存没有超过这个值,就是正常的,而,解析图片通常是最耗内存的操作.
在ImageView中显示一张,argb_8888,然后再解码一次,29*2+其它的操作,对象内存,勉强>64m了,只能解码一次.
使用rgb_565解码一次15m左右,可以有四次的机会,为什么不是三次呢,29*2<64,但一次解析大图,消耗的其它对象内存也大了.
于是修改了/system/build.prop中的heapsize=48m,重启了,
再运行,argb_8888一次解码正常的.二次崩溃.
使用rgb_565解码,可以两次,三次崩溃.
于是修改了/system/build.prop中的heapsize=24m,重启了,
再运行,argb_8888一次崩溃.
使用rgb_565解码,可以一次,第二次崩溃.
,由此可见,不是一张大的图不可以显示出来,通常一张拍摄的照片像2592*1936这样的,有这样的分辨率,就有相应的机器对应,所以内存也就大了,不是所谓的8m.
由于只分析了一些实践结果,对系统的代码没有研究,有可能这是不对的,或许
c对解码图片作了一些内存上的限制.
但是可以知道,8m的内存是不对的,即使现在新机器中最烂的也不小于512m的内存,heapsize也>24m,所以对于上面这种大的图片,使用rgb_565解码,是没有问题的.
final int memClass = ((ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
System.out.println("memClass:"+memClass);
可以得到这个值的大小.
最近做的微博程序中大图浏览直接崩溃,内存不足,64m的内存,缓存各种图片64张,图片大小大约是在400*1600,几十张图片加载后就崩溃了.
当然如果没有必要,还是缩放一下较好:
BitmapFactory.Options options = new BitmapFactory.Options();
使用缩放的效果明显要比使用rgb_565解码糟糕的多了.
分享到:
相关推荐
文档标题和描述中提到的“ANDROIDBITMAP内存限制OOM,OUTOFMEMORY”指的就是在处理位图(BITMAP)时超出了虚拟机(VM)的内存预算,导致系统抛出OutOfMemoryError异常。 根据给出的内容部分,我们可以推断出以下知识...
本文将深入探讨Android Bitmap内存限制以及如何避免OOM错误。 首先,我们需要理解引发上述错误的原因。当Android系统尝试分配一块超过其当前可用内存大小的内存时,会抛出`java.lang.OutOfMemoryError: bitmap size...
在Android开发中,处理`Bitmap`内存溢出问题是一个常见的挑战,尤其是在处理高分辨率或大尺寸图片时。当应用程序尝试加载或操作一张超出虚拟机内存预算的`Bitmap`时,系统会抛出`java.lang.OutOfMemoryError: bitmap...
在Java(包括Android)中,每个应用都有一定的内存限制。当应用尝试分配的内存超过其可用的堆内存时,就会抛出此错误。Bitmap对象是直接存储在堆内存中的,因此大量或者大尺寸的Bitmap会迅速消耗掉内存。 解决`...
6. **Bitmap内存管理与优化** 处理Bitmap时,需要考虑内存占用。大型Bitmap可能导致内存溢出。可以通过`Options`对象设置解码时的宽高限制,使用`inSampleSize`降低解码后的图像分辨率,从而减少内存消耗。此外,...
内存溢出(Out Of Memory,简称OOM)通常发生在应用消耗的物理内存超过了系统分配给它的最大内存限制。对于Android而言,当一个进程使用的本机或Java堆内存超过了一定阈值时,就会触发OOM错误。`Bitmap`作为占用内存...
特别是在处理大尺寸图片时,由于内存限制,系统可能无法分配足够的内存,从而导致应用崩溃。"处理android bitmap oom 2.0版本关闭了硬件加速"这一主题,关注的是如何在Android 2.0版本及其后续版本中避免Bitmap导致...
在Android开发中,Bitmap对象是用于处理图像的主要类,但如果不妥善管理,它可能会引发“Out Of Memory”(OOM)错误。...记住,每个应用都有其特定的内存限制,理解并适应这些限制是成功避免OOM的关键。
理解并熟练运用这些知识点,开发者可以有效地管理Bitmap内存,避免因图像处理导致的内存问题,从而提高应用性能和用户体验。在实际开发中,还需要关注Android系统的版本差异,因为不同的Android版本可能有不同的...
这是因为Android设备的内存有限,尤其是当加载大图或大量图片时,容易超出可用内存限制。"处理android bitmap oom 2.0版本"是一个针对这个问题的解决方案更新,它旨在修复前一版本中回收Bitmap对象可能导致的问题。 ...
Bitmap占用大量内存,因此在Android中管理Bitmap内存至关重要。可以使用`options.inSampleSize`来降低图片质量,减少内存占用。此外,使用`BitmapFactory.Options`的`inPurgeable`和`inInputShareable`属性可以允许...
- 考虑到Android设备的内存限制,转换后的Bitmap应使用适当配置,如调整大小、选择适当的压缩格式(如ARGB_8888或RGB_565)等,以减少内存消耗。 - 使用异步操作,避免UI线程阻塞,可以使用AsyncTask或其他异步...
在Android系统中,每个应用都有一个独立的Dalvik/ART虚拟机实例,其最大堆内存通常限制在16MB左右,这对于一些需要处理大量数据或资源的应用来说可能显得不足。 内存溢出(OutOfMemoryError)是Android开发中常见的...
Android提供了多种方法来创建和加载Bitmap,例如从资源文件、文件系统、网络或内存中。 在Activity间传递Bitmap,有两种主要方式:Intent extras和使用Parcelable接口。由于Bitmap对象较大,直接通过Intent的extras...
1. **了解内存限制**: Android系统对每个应用分配一定的内存空间,这个值在不同设备上会有所不同。了解目标设备的内存规格有助于设定合理的内存管理策略。 2. **使用轻量级数据结构**: 在处理数据时,优先选择...
- 开发者在实际应用中,需要根据具体设备的性能和内存限制,对工具类进行充分的测试和调整,确保在各种情况下都能稳定运行。 综上所述,处理Android中的图片内存溢出问题需要综合运用多种策略,结合特定场景进行...
Android设备的默认最大堆内存限制通常是16MB,但不同设备可能有所不同。 - **栈(Stack)**:栈内存用于存储基本类型变量(如int、float等)、对象引用和方法调用时的局部变量。栈内存分配速度快,但由于其大小和...
- 考虑到Android平台的资源限制,一个良好的图片处理库应该具备性能优化。此库可能采用了内存管理策略,如缓存策略,以减少内存消耗和提高处理速度。 7. **兼容性**: - 作为一个成熟的Android库,它应该兼容广泛...
在Android开发中,Bitmap对象是处理图像数据的核心类,但如果不正确地管理Bitmap,可能会导致内存溢出等问题。本篇文章将深入探讨Android Bitmap的压缩方法,特别是如何选择合适的压缩策略以适应不同的场景需求,...