4

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

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

在缩略图中有大约 10 多张图像之前,一切都运行良好……

我正在通过与缩略图相同的方式加载 mainImage url,因此当他们单击缩略图中的图像时,它会将其加载到顶部。

我在方法本身中回收位图,但它似乎内存不足并在加载超过 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);
  }
    }
4

8 回答 8

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);

    }
于 2012-11-30T14:23:33.890 回答
1

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

有效地显示位图

有效加载大型位图

于 2012-11-30T14:38:20.083 回答
1

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

in.close();
in = null;
于 2012-11-30T14:39:39.563 回答
0

您不应该为此使用 ScrollView。您应该使用 ListView。当您使用 ScrollView(其中带有 LinearLayout 或类似的东西)时,列表中的所有元素(无论它有多大)都将尝试立即加载。尝试使用 ListView (正是出于这个原因,它只在内存中加载可见行的 ui 元素)。

于 2012-11-30T14:49:10.883 回答
0

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

回答

于 2013-06-19T08:09:16.920 回答
0

我用这个。。

Options opt = new Options();
opt.inPurgeable = true;
opt.inInputShareable = true;
opt.inPreferredConfig = Bitmap.Config.RGB_565;
于 2013-07-01T08:25:12.590 回答
0

您可能必须为位图使用某种缓存策略,尝试查看Universal Image Loader库,它非常适合您的需要

仅当您确定不再使用位图时,才应自行回收位图。

于 2012-11-30T14:23:28.647 回答
0

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

于 2012-11-30T14:38:16.680 回答