在Android中显示来自服务器的字节数组的图像

时间:2012-04-30 14:33:02

标签: android android-imageview out-of-memory bitmapfactory

我的Android应用程序连接到服务以从我们的服务器请求文件。在请求时,文件类型未知,但服务器回复将包含文件扩展名和文件数据的字节数组的Hashmap。

我的移动应用程序然后获取此数据,如果它是jpg,png,txt或html文件,它将在屏幕上显示该文件。如果它是不同的文件类型,则会创建一个文件,系统会提示系统尝试在外部应用程序中打开该文件。

text,html和外部文件都没有问题。图像对于我加载的第一个图像工作正常,但是如果我再次调用服务器来加载列表中的下一个图像,我经常会收到此错误:

   E/AndroidRuntime(390): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

我正在使用相同的服务器调用,并将新信息存储在旧信息上。 这是我实际加载图像数据的代码:

  imageView.setImageBitmap(BitmapFactory.decodeByteArray(bytes, 0, bytes.length));

有没有办法处理内存问题,所以我的应用程序不会崩溃?我已经尝试从服务器端缩小图像,使它们更小,更易于管理(但这似乎是一个绑带而不是正确的修复。)目前我只是使用原始字节和BitmapFactory来加载imageView,但如果有另一种方式,我总是可以用实际的png或jpg创建一个临时文件,如果这样做会有所帮助。

有人可以提供一些关于处理此问题的最佳方法的建议吗?

2 个答案:

答案 0 :(得分:3)

图片使用你的应用程序拥有的大量几兆字节RAM。应用程序需要在内存中保存的1Megapixel = 4Megabyte raw imagedata(至少RGBA_8888模式)。任何设备上都会出现多个大图像。

  • 将图像下载到文件系统,从那里使用它们并使用sample size > 1解码它们,如果它们比你需要的更大/你有记忆。
  • 如果您不需要,立即
  • recyle()张图片。它们的原生缓冲区与GC不兼容。

答案 1 :(得分:0)

首先确保以适合屏幕的方式解码和缩放位图。 在设置新位图之前,还要从imageView回收位图。你需要保持对解码后的位图的引用,或者像这样访问旧的位图。

    Drawable d = imageView.getDrawable();
    if (d!=null && d instanceof BitmapDrawable){
        BitmapDrawable bd = (BitmapDrawable)d;
        bd.getBitmap().recycle();
    }