2012-04-21 68 views
2

因此,在蜂窝之前,位图obeject只是一个本机堆 内存空间(使用malloc)的指针,我可以清理调用.recycle()的本机内存。在honeycomb之后,位图的内存被分配到应用程序堆中,从而获得gc调用。位图内存泄漏

我的问题是,我的应用程序需要支持2.2+,所以我该怎么办?检查版本并调用recyle?根本不打电话回收?你对此有何建议?因为我有一个容纳一些Bitmap实例的BitmapCache,我不希望它们永远留在内存中。

回答

3

在任何android版本中,无论是froyo,姜饼还是蜂窝。你必须检查自己的内存管理。是的,从2.2+开始,您可以从sdcard调整应用程序,但是将位图保存在堆内存中始终会为您是否使用任一版本创建问题。如果你想纯粹使用位图,那么为什么不按照他们的方式,试试这个链接。他们给了你很多方法来有效地管理位图。请点击此链接: Displaying bitmaps efficiently

0

第一,任何Android平台的版本,如:安卓2.2或Android 3.0,比Android 3.0的更高,你不想使用,你还需要调用bitmap.recycle()

虽然android >=3.0位图,位图保存在达尔维克堆中,不保存在本机堆中。所以对于java堆来说,如果你有一些引用来引用这个对象,那么这个对象不可能是gc,而且位图内存可以占用很多内存,如果你不确保对象引用计数器是零,那么它将会是一个大的问题。

你说可以保存位图,因此如果使用WeakReferenceSoftReference保存位图,并使用WeakReference.get()SoftReference.get()返回位图的位图缓存,bitmap引用是系统的权限控制。否则,你需要自己管理。

+0

所以,如果我有一个WeakReference的,GC将照顾这对我好吗?但是,我的实现必须为pre 3.0版本调用recycle()?我应该何时打电话回收?为什么在本教程中http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html他们表示不建议使用Soft和Week References? – 2012-04-21 16:50:56

+0

无论何时完成位图,您都应该调用recycle()(不管版本),然后将其设置为null。这取决于你想要什么时候应该调用它。 我倾向于重用位图而不是删除它们并创建新位图。 – 2012-04-24 15:12:45

0

正如你在developer pages注意到他们说,弱referencies是过时的解决方案。检查从链接我离开这里所有的位图引用的教程,并尝试使用scaling down(如果可能),缓存和的AsyncTask,以及lazy bitmap loading from this example ..

这些东西相结合,将是解决办法,我敢肯定..

顺便说一句..我目前对这个话题也引起只是弱引用是好的,但不是完美的解决方案,我要让我的应用程序lag-证明未来版本的AndroidOS。

希望这不是太大的联系,但是当我们得到它,它会像一个魅力;)

干杯