私はその行を知っています
Drawable.createFromStream(fileInputStream, "src");
アプリのメモリ制限に達したときに、OutOfMemory エラーをスローすることができます。ただし、メモリを効率的に使用することに関しては、非常に勤勉だったと思います。
実際にドローアブルを取得するブロックは次のとおりです。
if(file.exists()) {
//Get image from app files, null if it doesn't exist
try {
FileInputStream fis = context.openFileInput(filename);
drawable = Drawable.createFromStream(fis, "src");
fis.close();
if(!saveInCache)
mInstanceCache.put(urlString, drawable);
return drawable;
} catch(Exception e) {
e.printStackTrace();
}
}
私の側では OutOfMemory 例外を再現できたことは一度もありませんが、実際に遭遇したユーザーから 1 日に 2 ~ 3 件の報告を受けています。コードをより効率的にしたいのですが、アイデアがありません。私はすでに次のことを行っています:
1)リストビューを離れるとすぐにクリアされるキャッシュに小さな画像(リストビューサイズ)を追加します。
2) イメージが新しいイメージに置き換えられるか、大きなイメージをホストするアクティビティの onStop() が呼び出されるたびに、常に ImageView のドローアブルをクリアし、ガベージ コレクションを実行します。
それで十分だと思ったが、そうではなかった。私が考えたことの 1 つは、ドローアブルの代わりにビットマップに切り替えることでした (Android 独自の BitmapFactory を使用)。それはメモリ/効率の点でも違いを生むでしょうか?
フィードバックをお待ちしております。ありがとう!