Tag: 原生的

如何将位图caching到本机内存

对于我的10,000点,我已经决定与这个酷酷的网站相提并论:一种机制来caching本地内存上的位图。 背景 Android设备的每个应用程序的内存数量非常有限 – 堆栈范围从16MB到128MB,具体取决于各种参数 。 如果你通过这个限制,你会得到OOM,这在使用位图的时候会发生很多次。 很多时候,一个应用程序可能需要克服这些限制,在庞大的位图上执行繁重的操作,或者只是将它们存储起来供以后使用,而且您需要 我想到的是一个简单的java类,它可以使事情变得更容易。 它使用JNI来存储位图数据,并能够在需要时进行恢复。 为了支持这个类的多个实例,我不得不使用我发现的一个技巧( 这里 )。 重要笔记 数据仍然存储在RAM中,所以如果设备没有足够的RAM,应用程序可能会被终止。 请记住尽快释放内存。 这不仅是为了避免内存泄漏,而且也是为了避免系统优先被杀死,一旦你的应用程序进入后台。 如果不想忘记释放内存,则可以在每次还原位图时释放它,或者使类实现可closures 。 作为一个安全措施,我已经使它在finalize()方法中自动释放它的本地内存,但是不要让它对这个工作负责。 这太危险了。 当这种事情发生的时候,我也把它写入日志。 它的工作方式是将整个数据复制到JNI对象中,为了恢复,它从头开始创build位图并将数据放入其中。 正在使用和恢复的位图是ARGB_8888格式。 当然,你可以改变它到任何你想要的,只是不要忘记改变代码… 大的位图可能需要一些时间来存储和恢复,所以在后台线程上执行它可能是明智的。 这不是一个完整的OOM解决scheme,但它可以帮助。 例如,您可以将其与您自己的LruCache一起使用,同时避免将caching本身用于堆内存。 代码仅用于存储和恢复。 如果你需要执行一些操作,你将需要进行一些研究。 openCV可能是答案,但如果你想执行一些基本的东西,你可以自己实现它们( 这里是一个使用JNI旋转大图片的例子 )。 如果你知道其他的select,请在这里告诉我。 希望这对一些人有用。 请写下您的意见。 另外,如果您发现代码有任何问题或意见不清,请告诉我。 解决scheme更好 如果你想在JNI方面执行更多的操作,你可以使用我所做的这篇文章 。 它基于我在这里编写的代码,但允许您执行更多操作,并且可以轻松添加更多自己的代码。