2

我为一个按钮编写了一个代码,让我可以从应用程序中的一个活动转移到我的主要活动。但是在运行过程中发生了错误:

07-21 09:28:13.864: E/dalvikvm-heap(371): 25165824 字节的外部分配对于这个进程来说太大了。07-21 09:28:13.864: E/GraphicsJNI(371): VM 不允许我们分配 25165824 字节

我使用了一张图片并将它们存储在我的数据库中,但没有任何回收,这是问题吗?这是我在位图中的代码:

try {
             Log.d("to get image", "ok");
            ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView1);
          Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageInfo.get(position)).getContent());
          imageView.setImageBitmap(bitmap);
          } catch (MalformedURLException e) {
          e.printStackTrace();
         } catch (IOException e) {
        e.printStackTrace();
        }

我的应用程序假设从 youtube 检索任何关键搜索词的默认图像并将它们存储在我的数据库中。

4

2 回答 2

0

这个错误意味着你有一个太大的图像里面。这里的问题是,你得到了内存泄漏。如果您使用位图,最好的方法是使用适合多个设备的小位图。如果您使用位图,如果不再使用此位图,也请调用 recycle()。我建议通读本指南以使用位图:

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

此外,如果您无法进行回收,还有一个替代方案。您可以将您的位图缩放到您的需要,就像在 stackoverflow 的另一个线程中完美解释的那样:

将图像加载到 Bitmap 对象时出现奇怪的内存不足问题

于 2013-07-21T09:54:00.677 回答
0

Android 应用程序的堆大小有限(旧设备上的最小堆大小为 16MB)。这因设备而异,因此在 QA 期间要小心。由于位图每个像素最多可以占用 4 个字节,因此大位图可以轻松填满您的堆(1000 x 1000 像素 = 3.8MB)。您的位图似乎占用了 25MB,这是巨大的!

这意味着您必须非常小心并使用几种策略来避免浪费内存:

  1. 当您不再需要位图时,释放它并调用bitmap.recycle()以确保立即释放内存。如果您将来再次需要该位图,您可以从磁盘/资源中再次加载它。

  2. 如果位图大于您的屏幕尺寸,您可以将其缩小以节省内存。这里的技术可以让你加载它最初减少 2/3/4。如果你需要更多的微调,你可以加载它的全尺寸,然后使用Bitmap.createScaledBitmap. 只是不要recycle()立即忘记原始的大位图。

请注意,使用位图缩放,我不建议只调整源图像的大小。不同的安卓设备有不同的分辨率。所以我会保持我的源图像足够大,以便在可用的最高分辨率设备上看起来完美。低分辨率设备通常具有较少的堆内存,因此运行时缩放会处理这些问题。

于 2013-07-21T10:13:50.683 回答