イメージキャッシュは、私が構築してアプリストアに入れたアプリの重要な部分でした。アプリケーションは、画像をダウンロードしてメモリとSDCardの両方にキャッシュする必要があり、スコープは1回の実行を超えて拡張されます。
一般的な考え方は、(a)画像を関連コンテナ(HashMap)にメタデータに基づくキーを介して格納し、b)画像ファイルをSDカード。
メモリが不足している間は、HashMapを解放します。それでもなお、SD_Cardからイメージを取得し、再びメモリにキャッシュすることができます。
私はこれをリサイクルせずに行うことができましたが、メモリの問題はありません。私が理解しているように、リサイクルは必要ありませんが、ビットマップ用のビットマップの割り当ては、Gingerbread以前のOSでネイティブメモリを使用しているため、「ビットマップ」に使用されていたメモリの初期リリースを取得するのに役立ちます。つまり、Dalvikヒープの一部ではないメモリです。したがって、ガベージコレクタはこのメモリを解放せず、実装固有のポリシーによって解放されます。
これは、CACHE_MANAGERクラスからである。ここでは
public static synchronized void addImage(Bitmap b, String urlString, boolean bSaveToFile, IMAGE_TYPES eIT, boolean bForce)
{
String szKey = getKeyFromUrlString(urlString, eIT);
if (false == m_hmCachedImages.containsKey(szKey) || bForce)
{
m_hmCachedImages.put(szKey, b);
if (bSaveToFile)
{
boolean bIsNull = false;
// Write a null object to disk to prevent future query for non-existent image.
if (null == b)
{
try
{
bIsNull = true;
b = getNullArt();
}
catch (NullPointerException e)
{
e.printStackTrace();
throw e;
}
}
// Don't force null art to disk
if (false == File_Manager.imageExists(szKey) || (bForce && bIsNull == false))
File_Manager.writeImage(b, szKey);
}
}
}
// writeImageの例()File_Managerクラスから
public static void writeImage(Bitmap bmp, String szFileName)
{
checkStorage();
if (false == mExternalStorageWriteable)
{
Log.e("FileMan", "No Writable External Device Available");
return;
}
try
{
// Create dirctory if doesn't exist
String szFilePath = getFilesPath();
boolean exists = (new File(szFilePath)).exists();
if (!exists)
{
new File(szFilePath).mkdirs();
}
// Create file
File file = new File(szFilePath, szFileName);
// Write to file
FileOutputStream os = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.PNG, 90, os);
} catch (IOException e)
{
// Unable to create file, likely because
// external storage is
// not currently mounted.
Log.e("FileMan", "Error writing file", e);
} catch (Exception e)
{
e.printStackTrace();
throw e;
}
}
30-40の画像サイズ50x50は、OOMEを引き起こしません。 おそらく大きなものをロードしますか?そうであれば、それらを縮小することができます。 また、一部の画像がSoftReferenceから消去される場合、それらは使用されていないので、必要に応じて再ロードしてください。 –