【问题标题】:Android out of memory on picture loadAndroid在图片加载时内存不足
【发布时间】:2014-01-28 14:28:27
【问题描述】:

我正在将图像加载到 android 手机的内存中,这样我就可以通过 web 服务将它们传递到 web 服务中。

有时我会出现内存不足错误,我已经可以用

捕获这个异常了
    try{
        bm = BitmapFactory.decodeFile(path);
    }catch(OutOfMemoryError ofmE){
        System.out.println("OUT OF MEMORY $$$$$$$$" + ofmE);
    }

虽然我需要执行这个操作,所以我需要清理内存。我怎样才能做到这一点?我的意思是程序化。

【问题讨论】:

  • 将大型位图加载到内存中是一个经典问题。你必须缩小它们:developer.android.com/training/displaying-bitmaps/… 否则,寻找一种方法来传递文件而不解码它。
  • 确实如此,但它可能总是给你一个内存不足的异常。
  • 文件的大小无关紧要,重要的是加载到内存时的大小。例如,您可以使用 RGB_565 而不是 ARGB_8888(默认值)将大小减半 - 请参阅@NigelK 发布的链接

标签: java android memory out-of-memory ram


【解决方案1】:

您可以使用Picasso。这是更清洁的方式。

【讨论】:

  • 开销太大了,只是为了清理内存。我当然不需要添加新库,因为这是一个大型项目的一部分。
  • 您可以使用System.gc();,但这样您并不能解决问题。在创建位图之前,您需要 recycle() 未使用的位图并调整图像大小。相信我,使用毕加索,你会更快乐。
【解决方案2】:

你注意到方法 decodeFile(String pathName, BitmapFactory.Options opts) 了吗?使用选项缩小图像大小以节省内存。请参阅BitmapFactory.Optionspublic int inSampleSize 如果设置为 > 1,则请求解码器对原始图像进行二次采样,返回较小的图像以节省内存。例如,您可以设置inSampleSize = 4。要回收位图,可以使用 bm.recycle();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    相关资源
    最近更新 更多