【发布时间】:2012-10-12 06:17:50
【问题描述】:
我是安卓新手! 我对 Android 的 SDK 有一些巨大的问题,因为我正在开发一个使用巨大位图(> 1200 * 1000)的应用程序,问题是在应用程序期间我需要多个相同大小的图层/位图(其中 3-5 个) .问题是内存堆在这些分配之一上消耗得非常快,并且触发了 OutOfMemory 异常。
好处是我不需要同时使用所有位图。
我尝试调用 recycle() 方法,虽然我知道它已经过时,因为位图的内存现在驻留在堆上,而不是本机内存上。 我还尝试从特定位图中删除所有引用,甚至手动调用 System.gc() 但没有用,无法删除位图。 好吧,也许会有我不知道的内存泄漏,尽管我对此表示怀疑。
我尝试了各种解决方案,但都没有奏效。
对我来说最好的选择是重用位图,但是 BitmapFactory 的解码方法只知道分配一个消耗内存的新位图。
我的问题是,您是否知道一种重用位图像素的方法(在不分配另一个位图/像素数组的情况下覆盖位图的像素),它可以与 Android 一起使用?问题是我不能驻留在 GarbageCollector 解决方案上,因为我的应用程序中有特定时刻我必须确定这些位图已从内存中删除/其他位图不会被分配。
另一种解决方案是:你知道直接在 sdcard 上绘制一些位图而不通过堆内存的方法吗?当我尝试分配一个大位图(原始大小的两倍)来连接其他两个已处理的位图时,它会崩溃……这就是我要问的原因。是否有可能直接从数据流中实例化 Canvas 或其他绘图对象?
其他解决方案是使用虚拟交换内存之类的东西,它可以模拟堆内存,但在 SDCARD 或其他东西上进行缓存。但也找不到这样做的方法。
【问题讨论】:
-
“我尝试了 recycle() 方法调用,虽然我知道它已经过时了,因为位图的内存现在驻留在堆上,而不是本机内存上。”。从 Android 3.2 开始就是这样
-
是的!我在 Android 4.0 中的目标!
标签: java android bitmap garbage-collection reusability