内存不足加载imageViews

时间:2012-11-30 14:19:16

标签: android imageview

我有一个滚动视图,其中包含通过AsyncTask加载的小图像缩略图,并将图像URL抛出到imageView。

它们是动态添加的,然后在顶部,是一个主imageView,它包含您单击的缩略图的图像。

在缩略图中有大约10张图片之前,一切都很顺利......

我正在通过与缩略图相同的方式加载mainImage网址,因此当他们点击拇指中的图片时,会将其加载到顶部。

我正在回收方法本身的位图,但是当加载10个以上的图像时,它似乎耗尽内存并崩溃(缩略图加载正常,但是当我点击加载主图像时崩溃)

任何帮助表示赞赏

这是我使用加载图像的代码(缩略图+主要):

    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
      ImageView bmImage;

      public DownloadImageTask(ImageView bmImage) {
          this.bmImage = bmImage;
      }

  protected Bitmap doInBackground(String... urls) {
      String urldisplay = urls[0];
      Bitmap mIcon11 = null;
      try {
        InputStream in = new java.net.URL(urldisplay).openStream();
        mIcon11 = BitmapFactory.decodeStream(in);
      } catch (Exception e) {
          Log.e("Error", e.getMessage());
          e.printStackTrace();
      }
      return mIcon11;
  }

  protected void onPostExecute(Bitmap result) {
      bmImage.setImageBitmap(result);
  }
    }

8 个答案:

答案 0 :(得分:1)

只需在你的图像上实现这个...它会将你的图像减少4倍

public static Bitmap getImage(byte[] image) {
        BitmapFactory.Options config = new BitmapFactory.Options();
        config.inPreferredConfig = Bitmap.Config.RGB_565;
        config.inSampleSize = 4;
        return BitmapFactory.decodeByteArray(image, 0, image.length,config);

    }

答案 1 :(得分:1)

您应该阅读以下两个Android官方教程。他们将教你如何有效地加载大位图,并提供我们在生产应用程序中使用的工作代码示例

Displaying Bitmaps Efficiently

Loading Large Bitmaps Efficiently

答案 2 :(得分:1)

您没有关闭输入流。因此,当图像url执行输入流对象时,所有这些都是昂贵的并且导致OutofMemoryError。在catch块之后添加以下代码。

in.close();
in = null;

答案 3 :(得分:0)

您可能需要为位图使用某种缓存策略,尝试查看库Universal Image Loader,它可以很好地满足您的需求

只有在您确定不再使用位图时,才能自行回收位图。

答案 4 :(得分:0)

尝试将位图的大小调整为更小的尺寸(使用像1.5这样的因子:width = widt * 1.5) 然后在你的视图中拉伸(适合xy或其他)。由于你决定的因素,它会降低图像的质量。这是一种快速的肮脏方式。也像Niun Goia提到的位图rgb提到效果很好。

答案 5 :(得分:0)

您不应该使用ScrollView。你应该使用ListView。当您使用ScrollView(其中包含LinearLayout或其类似内容)时,列表中的所有元素(无论它有多大)都会尝试立即加载。尝试使用ListView(这是出于某种原因,它只在内存中加载可见行的ui元素)。

答案 6 :(得分:0)

您可以使用android:largeHeap =“true”来请求更大的堆大小

answer

答案 7 :(得分:0)

我用这个..

Options opt = new Options();
opt.inPurgeable = true;
opt.inInputShareable = true;
opt.inPreferredConfig = Bitmap.Config.RGB_565;