我正在将 Asset 文件夹中的 100 张图像加载到数组对象中。图片非常小(每张 png ~20k),我使用此代码对其进行处理,并防止内存泄漏和优化性能:
循环中:
// create resized bitmap from asset resource
InputStream istr = assetManager.open(pics[i]);
Bitmap b = BitmapFactory.decodeStream(istr);
b = Bitmap.createScaledBitmap(b, 240, 240, true);
其中 pics[i] 是位于我的资源文件夹中的文件名列表。
该代码适用于我,但我仍然不时收到来自用户的错误(我在开发人员控制台错误上看到它):
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
at android.graphics.Bitmap.createBitmap(Bitmap.java:435)
at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340)
我能做些什么来改善它吗?或者这是Android的世界,我们永远无法交付完美的应用程序?
当然你可以改进一些:不要同时将太多图片加载到内存中(或减小它们的大小)。有些设备没有太多可用内存。您的设备的堆限制可能比某些客户的手机更高。因此,当它对你有用时,它会对他们崩溃(请参阅这个视频 http://www.youtube.com/watch?v=_CruQY55HOk对于某些堆限制 [at 4:44])。
您可以通过以下方式获取可用的堆大小ActivityManager.getMemoryClass() http://developer.android.com/reference/android/app/ActivityManager.html#getMemoryClass%28%29.
为了改进这一点,请测试您现在需要哪些图片(哪些已显示),哪些不需要。仅加载所需的位图并回收不再需要的位图。
也尝试使用BitmapFactory.decodeResource()
and BitmapFactory.Options.inSampleSize
。这允许您直接以较低分辨率加载图像,而无需像此处那样以完整尺寸加载图像,然后调整它们的大小。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)