`
dengyin2000
  • 浏览: 1224989 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android避免decodeResource图片时占用太大的内存。

 
阅读更多
增加largeHeap="true"属性。

android:largeHeap
Whether your application's processes should be created with a large Dalvik heap. This applies to all processes created for the application. It only applies to the first application loaded into a process; if you're using a shared user ID to allow multiple applications to use a process, they all must use this option consistently or they will have unpredictable results.
Most apps should not need this and should instead focus on reducing their overall memory usage for improved performance. Enabling this also does not guarantee a fixed increase in available memory, because some devices are constrained by their total available memory.

To query the available memory size at runtime, use the methods getMemoryClass() or getLargeMemoryClass().



我们知道调用BitmapFactory.decodeResource时,如果手机屏幕的密度很大时,如果只是在hdpi放了图片, decode出来的bitmap会自动的scale放大。 而且如果按照ARGB_8888模式decode的话一个像素需要4个字节,这样343*433分辨率的图片decode大概会占用2M多内存。 所以从2方面控制,一个是禁止scale, 一个是使用ALPHA_8模式decode。注意:这里需要看看效果是否ok, 因为使用低质量的模式decode图片可能会修饰一些图片的细节。

    /**
     * 因为目前我们只有一套资源文件,全都放在hdpi下面,这样如果是遇到高密度手机, 系统会按照
     * scale = (float) targetDensity / density 把图片放到几倍,这样会使得在高密度手机上经常会发生OOM。
     *
     * 这个方法用来解决在如果密度大于hdpi(240)的手机上,decode资源文件被放大scale,内容浪费的问题。
     * @param resources
     * @param id
     * @return
     */
    public static Bitmap decodeResource(Resources resources, int id) {

        int densityDpi = resources.getDisplayMetrics().densityDpi;
        Bitmap bitmap;
        TypedValue value = new TypedValue();
        resources.openRawResource(id, value);
        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inPreferredConfig = Bitmap.Config.ALPHA_8;
        if (densityDpi > DisplayMetrics.DENSITY_HIGH) {
            opts.inTargetDensity = value.density;
            bitmap = BitmapFactory.decodeResource(resources, id, opts);
        }else{
            bitmap = BitmapFactory.decodeResource(resources, id);
        }

        return bitmap;
    }


分享到:
评论

相关推荐

    android有效解决图片过大内存溢出的问题

    这是因为Android设备的内存资源有限,而图片作为数据量较大的资源之一,在加载、处理过程中极易占用过多内存,导致应用程序崩溃。特别是当应用需要处理高清图片或者大量图片时,这一问题更为突出。 #### 二、根本...

    android图片瀑布流优化版,防止内存溢出

    - **使用BitmapFactory.Options**:在加载图片时,通过`BitmapFactory.decodeStream()`或`decodeResource()`方法配合`Options`对象,可以设置`inSampleSize`来降低图片解析的分辨率,减少内存占用。 - **延迟加载...

    Android 大图片加载

    例如,一个分辨率为4000x3000像素的图片,在未进行任何处理的情况下,其内存占用约为36MB(假设每个像素占用4字节)。这远超过大多数Android设备分配给应用的内存限制。 ### 3. 解决方案:缩放图片 为避免OOM,我们...

    加载大图片的时候如何防止内存溢出

    在 Android 系统中,加载大图片时经常会出现内存溢出的问题,这是因为 Android 系统给图片分配的内存只有 8M,当加载大量图片时,很容易超出这个限制,导致 OOM(Out of Memory)错误。为了解决这个问题,我们需要...

    Android图片处理源码

    BitmapFactory类提供了多种解码选项,如 decodeStream() 和 decodeResource() 方法,可以通过配置inSampleSize来降低图片的分辨率,从而减少内存占用。同时,也可以使用Bitmap的compress()方法将图片压缩为特定格式...

    Android处理内存泄漏的代码例子

    在Android开发中,内存泄漏是一个严重的问题,它会导致应用程序占用过多内存,影响性能甚至导致应用崩溃。本示例代码着重展示了如何避免Android应用中的内存泄漏,主要包括五个关键方面:关闭游标、重用适配器、回收...

    Android下利用Bitmap切割图片

    需要注意的是,创建新的Bitmap并不会改变原始Bitmap的内容,原始Bitmap仍然存在并占用内存,因此在不再需要时,记得调用`bitmap.recycle()`释放资源,避免内存泄漏。 除了基本的切割操作,我们还可以结合Canvas进行...

    Android开发双击图片放大缩小

    同时,考虑到内存管理,加载和缓存大图时需要合理使用Bitmap的配置,如ARGB_8888或RGB_565,以及适当的复用策略。 最后,将所有这些组件整合到一起,我们需要在布局文件中添加一个ImageView控件,设置其 ScaleType ...

    android处理图片内存溢出VM.pdf

    图片加载时的内存溢出主要因为大尺寸图片占用的内存远远超过了分配给应用的内存空间。 为了解决这一问题,Android SDK 提供了一系列解决方案,其中的核心方法是通过 Bitmap Factory 类加载图片时使用特定的选项来...

    android 处理大图片资源封装

    - **压缩图片**:在上传或下载前对图片进行压缩,降低其质量,可以显著减少内存占用。 8. **多线程处理**:大图片的加载和解码应在后台线程进行,以免阻塞UI线程导致应用无响应。 9. **监听系统内存**:通过...

    android大图片加载

    OOM是Android应用崩溃的常见原因之一,尤其是当涉及到大尺寸图片时。Android系统为每个应用程序分配了一定量的内存,如果超过了这个限制,系统就会终止应用。因此,正确地加载大图片并确保应用流畅运行至关重要。 ...

    android图片转pdf示例代码

    此外,对于大量图片的转换,可能需要分批处理,或者采用流式处理以减少内存占用。 总之,Android图片转PDF的示例代码结合了Android的图像处理能力和PDF库的功能,实现了从用户选择的图片到PDF文件的转换,为Android...

    android动态改变图片颜色(纯色)

    此外,如果需要频繁地改变图片颜色,为了提高性能,可以考虑使用硬件加速(设置Paint的`setFlags(Paint.FILTER_BITMAP_FLAG)`),或者使用LruCache缓存处理后的Bitmap,以减少内存占用和重复计算。

    android图片上添加文字

    可以使用`BitmapFactory.Options`的`inSampleSize`来减小图片尺寸,减少内存占用。 10. **异步处理**: 由于图片处理可能涉及较复杂的计算,建议在子线程(如AsyncTask)中进行,避免阻塞UI线程。 以上就是Android...

    解决Android 图片放大、缩小、旋转等问题

    在处理大量图片或高分辨率图片时,需要注意内存管理。Bitmap对象占用大量的内存,可能导致内存溢出(OOM)问题。为此,可以使用BitmapFactory的`decodeResource()`, `decodeStream()`, 或 `decodeFileDescriptor()`...

    安卓图片压缩类,避免内存溢出OOM

    总的来说,安卓图片压缩的核心目标是合理控制图片的内存占用,避免一次性加载过大图片导致的内存溢出。通过选择合适的压缩方法和库,结合内存管理和异步加载策略,可以有效地解决这个问题,实现更流畅、更节省资源的...

    Android图片的压缩与缓存

    例如,`inSampleSize = 2`会使图片宽度和高度缩小到原来的一半,内存占用也随之减小。 ```java BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 8; Bitmap bitmap = ...

    android_内存溢出处理

    Dalvik 虚拟机的堆内存分配对 Android 平台的性能有很大的影响。可以使用 dalvik.system.VMRuntime 类提供的 setTargetHeapUtilization 方法来增强程序堆内存的处理效率。 例如: ```java private final static ...

    Android有效解决图片问题

    上述代码展示了如何以最省内存的方式读取本地资源图片,设置了配置选项以减少内存占用,并使用`inPurgeable`和`inInputShareable`允许系统在内存紧张时释放Bitmap。 6. **避免一次性加载大量图片**: - 分批次...

    Android瀑布流图片效果

    - 图片压缩是减少内存占用和提高加载速度的关键步骤。Android中可以使用多种库来实现,如Glide、Picasso、Fresco等。这些库都内置了图片压缩功能,可以根据需求调整图片质量,减少尺寸,降低加载和显示的时间。 - ...

Global site tag (gtag.js) - Google Analytics