如何摆脱java.lang.OutOfMemoryError?

时间:2014-03-26 14:56:19

标签: java android out-of-memory android-imageview android-bitmap

我有3个ImageViews,我正在从URL中随机设置图像。我得到java.lang.OutOfMemoryError。我正在使用以下代码为ImageView设置图像。

 public void changeImages(){
     try {
          for(int i=0; i<items.size(); i++){
             URL imageUrl = new URL(items.get(i).getImageUrl());
             if(i == 0){
                 image1.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));
             }else if(i == 1){
                 image2.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));
             }else if(i == 2){
                 image3.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));
             }
          }
     } catch (Exception ex) {
          System.out.println("Exception in parseResponse: "+ex);
     }     
 }

image1,image2和image3是ImageViews。多次更改图像后,我得到了java.lang.OutOfMemoryError。知道怎么摆脱它?提前谢谢。

3 个答案:

答案 0 :(得分:0)

正如一条评论所暗示的,与Bitmap相关的内存错误通常是上下文内存泄漏的结果。你没有特别在这里展示它,但你的ImageView的上下文可能会泄漏,所以每次你重置图像时,它仍然保持在前一张图片的内存空间。这将很快超出你的记忆。您应该修复声明ImageView的任何泄漏,否则您可以在创建新的Bitmap之前适当地清除图像引用。这将允许垃圾收集器再次释放空间。

前一段时间我问了一个类似的问题,原因几乎相同,希望那里的答案能帮到你。

Android : Static Fields and Memory Leaks

答案 1 :(得分:0)

我猜您需要使用BitmapFactory选项加载缩放图像,例如

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options);

另见http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html

此外,您可能需要调用bitmap.recycle();

答案 2 :(得分:0)

您可以查看像this这样的库,将图片加载到您的视图中。另外,请查看Google recommendations关于Bitmap和内存管理的问题。如果您想自己进行一些清理,可以使用bitmap.recycle()并将Bitmap / Drawable设置为null