Android 在传感器侦听器中使用大量图像时发生outofmemoryexception
我正在开发一个有很多图像的应用程序,并使用一个传感器侦听器,我在活动开始时向传感器管理器注册该侦听器,以检测震动事件并根据震动方向更改图像 我在传感器更改(传感器事件)中读取事件值,以便在我的应用程序中使用它:Android 在传感器侦听器中使用大量图像时发生outofmemoryexception,android,bitmap,out-of-memory,sensors,Android,Bitmap,Out Of Memory,Sensors,我正在开发一个有很多图像的应用程序,并使用一个传感器侦听器,我在活动开始时向传感器管理器注册该侦听器,以检测震动事件并根据震动方向更改图像 我在传感器更改(传感器事件)中读取事件值,以便在我的应用程序中使用它: public void onSensorChanged(SensorEvent event){ accX = event.values[0]; accY = event.values[1]; accY = event.values[2]; } 我在活动暂
public void onSensorChanged(SensorEvent event){
accX = event.values[0];
accY = event.values[1];
accY = event.values[2];
}
我在活动暂停时注销传感器侦听器,并调用system.gc进行垃圾收集
在我参加一项活动之前,一切都很顺利
当我完成当前活动并打开另一个活动(同样有一个传感器侦听器)时,应用程序在一段时间后开始出现内存不足异常:
“OutOfMemoryException:位图大小
超出VM预算”
请注意,应用程序的堆大小永远不会超过4MB
还有一个观察结果是,如果不使用sensor listener,应用程序就不会崩溃,这让我认为在生成传感器事件和加载新活动时可能存在内存泄漏,因为可用内存较少,在活动中使用位图时,应用程序会发出OutOfMemoryException
因此,有两个可能的原因:
如果您能告诉我在大尺寸应用程序中使用图像的最佳方法,如何回收它们,并确认在使用传感器侦听器时是否确实存在内存泄漏,或者我应该在应用程序中查找的任何建议,这将非常有帮助。要正确回收图像,如果可能,请尝试使用Bitmap.recycle()方法这是因为图像实际上是作为参考保存的(在pre Honeycom中),而实际数据是使用本机内存分配的
在蜂窝中,图像的内存分配在堆上,因此很容易进行GCD。此外,您可以设置largeHeap=“true”(再次发布蜂窝)。仅供参考,您可以结合使用
SoftReference
和HashMap
对位图实现更好的内存控制。通过使用SoftReference
,当内存不足时,不再引用对象将释放内存
一个常见的例子:
HashMap<String, SoftReference<Bitmap>> cache;
...
Bitmap bitmapToRead = cache.get(key).get();
if (bitmapToRead == null){
cache.put(key, new SoftReference<Bitmap>(bitmap)); // bitmap from Storage for example
/* your operation */
}else{
/* your operation on bitmapToRead */
}
HashMap缓存;
...
位图位图位图读取=cache.get(key.get();
if(位图读取==null){
cache.put(key,new SoftReference(位图));//例如来自存储器的位图
/*你的手术*/
}否则{
/*你在bitmapToRead上的操作*/
}
但老实说,我经历过OutOfMemoryError
甚至使用了SoftReference
。为了克服这个错误,我所做的是手动recycle()
位图