0

私はその行を知っています

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 を使用)。それはメモリ/効率の点でも違いを生むでしょうか?

フィードバックをお待ちしております。ありがとう!

4

2 に答える 2

1

BitmapFactory.OptionsのinPurgeableオプションを使用して、ビットマップからドローアブルを作成してみてください。私は同じ問題を抱えていたことを覚えており、そのようにして解決しました。

于 2013-02-25T18:17:58.157 に答える
0

画像は大きくなければならないので、RAMが少ない電話ではOutOfMemory例外が発生します。可能であれば、画像のサイズと解像度を小さくしてみてください。http://developer.android.com/training/displaying-bitmaps/load-bitmap.htmlをご覧ください

于 2013-02-25T18:18:20.270 に答える