2013-07-21 33 views
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的默认图像的任何关键搜索词,并将它们存储在我的数据库。

+0

是你的图片尺寸大吗? – KOTIOS

+0

发布代码片段。 – 2013-07-21 09:53:20

+1

我的图像是任何YouTube视频的默认图像,所以有一个大的和小的 – Tolen

回答

0

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

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

此外,还有一个选择,如果回收是不可能的你。您可以缩放你的位图到你需要置身于另一个线程在计算器完全解释在这里:

Strange out of memory issue while loading an image to a Bitmap object

+0

不幸的是我会再次使用位图。 – Tolen

+0

当然,但只有当你再次开始主要活动,或者?所以在每一次开始时,再次创建这个位图,在每次完成时,都要回收这个图像。 – Opiatefuchs

+0

Opiatefuchs:非常感谢你,我错过了,并会尝试它谢谢。 – Tolen

0

Android应用程序有一个有限的堆大小(最小的旧设备是小到16MB)。这根据设备而异,所以在质量保证期间要小心。由于位图每个像素可能需要多达4个字节,因此大型位图可以轻松填满您的堆(1000 x 1000像素= 3.8MB)。你的位图似乎需要25MB,这是巨大的!

这意味着,你必须非常小心,并使用一些策略来避免浪费内存:

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

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

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

+0

talkol:非常感谢你。 – Tolen

+0

当然:)接受答案,如果它帮助你 – talkol

+0

talkol:这将是一种乐趣:) – Tolen