gridview のカスタム レイアウトがあります。gridview の各 raw には、プログレスバー、2 つのイメージビュー、および 2 つのテキスト ビューが含まれています。画像サイズはサムネイルサイズです。多くのビットマップをロードする必要がありますが、例: - 500 個の画像、メモリ不足エラーが発生します。画像は最初にインターネットからロードされ、次にSDカードに保存され、次回はSDカードからロードされているグリッドビューをロードします。この問題を克服する方法。グリッドビューが単一のイメージビューで膨張している場合、メモリ不足を克服するための多くの答えが見つかりました。カスタム レイアウトの使用中にこの問題を解決する方法を教えてください。グリッドビューでカスタム レイアウトを拡張しているときに、グリッドビューでこのメモリ不足エラーを処理するサンプル プロジェクトを知っているかどうか教えてください。
4 に答える
Application を拡張するクラスを作成するのが最善でしょう。このアプリケーション クラスは、アプリケーションがメモリ不足になるたびに onlowmemory() コールバックを提供します。そこに書くことができます
public void onLowmemory() {
Runtime.getRuntime().gc(); }
これにより、システム GC メソッドが呼び出されます。ガベージ コレクタ android を実行すると、未使用のオブジェクトがすべてガベージされます。
この問題を解決する別の方法があります。アニメーションでは、Runtime.getRuntime().gc(); を呼び出すことができます。ガベージコレクタを呼び出す。アクティビティの onDestroy() メソッドでも、Runtime.getRuntime().gc(); を呼び出すことができます。
だからあなたの問題は解決されます
私は同じ問題に直面しています。通常、OutOfMemoryError は次の原因で発生します。最初のアプローチは、
BitmapFactory.decodeFile(srcImg);
画像は表示前にビットマップに変換されるため、多くの大きなビットマップは通常エラーを引き起こします。
これを克服するために、次の関数を追加しました
public static Bitmap decodeWithBounds(String srcImg, int bounds) {
if (bounds > 0){
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(srcImg, options);
if (options.outHeight > bounds || options.outWidth > bounds){
options.inSampleSize = Math.max(options.outHeight/bounds, options.outWidth/bounds);
}
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(srcImg, options);
} else {
return BitmapFactory.decodeFile(srcImg);
}
}
この関数を使用して、境界 = グリッド サイズでビットマップをデコードします。
これでほとんどの問題が解決しました。
非常にローエンドな端末の場合は、try{} catch (OutOfMemoryError e){} ... を追加します。
メモリ不足のグリッドビューの画像に設定されたこのコードを試してください
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 8;//you set size qulity for image(2,3,,4,5,6,7,8 etc..)
Bitmap preview_bitmap=BitmapFactory.decodeStream(is,null,options);
このビットマップをイメージビューに設定します
このコードでメモリ不足例外の問題を解決します
Bitmap bitmap = BitmapFactory.decodeStream(is);
if (bitmap != null) {
Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 100, 100, true);
imageView = new ImageView(mContext);
imageView.setImageBitmap(resizedBitmap);
}