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

因此,有两个可能的原因:

  • 图像未正确回收
  • 每次出现SensorEvent时,都会有内存泄漏,从而减少应用程序的可用内存
  • 我还在这里使用评论51中描述的解决方案:

    循环使用所有内容,但仍会导致内存问题


    如果您能告诉我在大尺寸应用程序中使用图像的最佳方法,如何回收它们,并确认在使用传感器侦听器时是否确实存在内存泄漏,或者我应该在应用程序中查找的任何建议,这将非常有帮助。

    要正确回收图像,如果可能,请尝试使用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()
    位图