2011-06-13 16 views
0

私は多くの画像を持ち、動きの始めにセンサーマネージャーに登録したセンサーリスナーを使用して、揺れの方向に基づいて。センサーリスナーで大量の画像を使用するときのメモリ不足例外

私は私のアプリでそれを使用するためにonSensorChanged(SensorEvent event)のイベント値を読み取る:

public void onSensorChanged(SensorEvent event){ 
    accX = event.values[0]; 
    accY = event.values[1]; 
    accY = event.values[2]; 
} 

を、私は活動の一時停止にセンサーリスナーの登録を解除しても、ガベージコレクションのためにSystem.gcを呼び出します。

私は1回の活動に入るまで、すべてうまく機能します。私は、現在の活動を終了し、(再びAAセンサーリスナーを持つ)別のアクティビティを開くと

、アプリはしばらく後にメモリ不足の例外与える始まり:

を「OutOfMemoryExceptionがビットマップのサイズ は、VMの予算を超えて」

アプリケーションのヒープサイズは決して4 MBを超えないことに注意してください。

センサーリスナーを使用しないとアプリケーションがクラッシュしないということがもう1つあります。これは、センサイベントが生成されたときや新しいアクティビティがロードされたときにメモリリークが発生している可能性がありますアクティビティでビットマップが使用されるときにOutOfMemoryExceptionが返されます。

だから、一見2つの理由:イメージが適切にリサイクルされていない

  1. http://code.google.com/p/android/issues/detail?id=8488
  2. アプリ Android: reading accelerometer without memory allocation?
  3. ために利用可能なメモリが減少SensorEventがあるたび、どこかでメモリリークがあります

私はここのコメント51に記載されているソリューションも使用しています: http://code.google.com/p/android/issues/detail?id=8488

すべてをリサイクルするにはまだメモリの問題があります。

大きなサイズのアプリで画像を使用する最良の方法を教えてもらうと、センサーリスナーを使用している間にリサイクルして実際にメモリリークがないかどうかを確認する方法や、アプリ、それは本当に役立つでしょう。

答えて

0

イメージが正しくリサイクルされるように、可能であれば、Bitmap.recycle()メソッドを使用してみてください。これは画像が実際に参照として保存されているため(ハニカム前)、実際のデータはネイティブメモリを使用して割り当てられているためです。

ハニーコムでは、画像用のメモリがヒープ上に割り当てられているため、簡単にGCできます。さらに、largeHeap = "true"(ハニカムの後に)を設定することもできます。

0

SoftReferenceHashMapの組み合わせを使用して、ビットマップのメモリ制御を向上させることができます。 SoftReferenceを使用すると、メモリが不足しているときにオブジェクトを参照しなくなることでメモリが解放されます。

A一般的な例は:正直に言うけど

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 */ 
} 

、私も使用SoftReference<Bitmap>OutOfMemoryErrorを経験しています。私がこのエラーを克服するためにしたのは、手動でビットマップrecycle()です。

関連する問題