因此,在蜂窝之前,Bitmap 对象只是本机堆内存空间的指针(使用 malloc ),我可以调用 .recycle() 清理该本机内存;在蜂窝之后,位图的内存在应用程序堆中分配,这会得到 gc 调用。
我的问题是,我的应用需要支持 2.2+,我该怎么办?检查版本并调用回收?根本不叫回收吗?你对此有何建议。因为我有一个 BitmapCache 保存一些 Bitmap 实例,我不希望它们永远存在于内存中。
因此,在蜂窝之前,Bitmap 对象只是本机堆内存空间的指针(使用 malloc ),我可以调用 .recycle() 清理该本机内存;在蜂窝之后,位图的内存在应用程序堆中分配,这会得到 gc 调用。
我的问题是,我的应用需要支持 2.2+,我该怎么办?检查版本并调用回收?根本不叫回收吗?你对此有何建议。因为我有一个 BitmapCache 保存一些 Bitmap 实例,我不希望它们永远存在于内存中。
在任何 android 版本中,无论是 froyo、姜饼还是蜂窝。您必须检查自己的内存管理。是的,从 2.2+ 开始,您可以从 sdcard 调整您的应用程序,但是将位图保存在堆内存中,无论您使用哪个版本,总是会产生问题。如果你想纯粹使用位图,那么你为什么不按照他们的方式,试试这个链接。他们为您提供了许多有效管理位图的方法。按照这个链接: 有效地显示位图
首先,任何android平台版本如:android 2.2,或android 3.0,或高于android 3.0,你不想使用的位图,你也需要调用bitmap.recycle()
虽然android >=3.0
,位图保存在 dalvik 堆中,而不是保存在本机堆中。所以作为java堆,如果你有一些引用来引用对象,对象不能被gc
系统,并且位图内存可以占用很多内存,如果你不确保对象引用计数器为零,那将是一个大问题.
你说的位图缓存可以保存位图,所以如果你用WeakReference
orSoftReference
来保存位图,用WeakReference.get()
orSoftReference.get()
来返回位图,bitmap
引用就在系统的正确控制之下。否则需要自己管理。
正如您在开发人员页面上注意到的那样,他们说弱引用是过时的解决方案。从我留下的链接中检查所有位图引用的教程,并尝试使用缩小(如果可能)、缓存和 AsyncTask,以及本示例中的延迟位图加载..
这些东西结合起来将是我很确定的解决方案..
顺便说一句..我目前也在讨论这个主题,因为只是弱引用是可以的,但不是完美的解决方案,我想让我的应用程序在未来版本的 AndroidOS 中保持滞后。
希望它不是太多的链接,但当我们得到它时,它会像一个魅力;)
干杯