11

私のアプリの主な目的は、画像に示すように次のように画像を表示することです

ここに画像の説明を入力してください

private void setSelectedImage(int selectedImagePosition) 
{

    BitmapDrawable bd = (BitmapDrawable) drawables.get(selectedImagePosition);
    Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), (int) (bd.getIntrinsicHeight() * 0.9), (int) (bd.getIntrinsicWidth() * 0.7), false);
    selectedImageView.setImageBitmap(b);
    selectedImageView.setScaleType(ScaleType.FIT_XY);

}

詳細なコードはここにあります

次の行で例外がスローされます

Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), (int) (bd.getIntrinsicHeight() * 0.9), (int) (bd.getIntrinsicWidth() * 0.7), false);

上記の関数はから呼び出されonItemSelectedます。**アプリは2.2と2.3でも正常に動作しますが、4.1ではすぐに例外をスローします。上記のコードは正常に動作しますが、次の例外をスローします。2.2と2.3ではクラッシュは見られませんでしたが、4.1ではすぐにクラッシュします。JellyBeanのメモリ管理に大きな違いはありますか?**:

java.lang.OutOfMemoryError
AndroidRuntime(2616):   at android.graphics.Bitmap.nativeCreate(Native Method)
AndroidRuntime(2616):   at android.graphics.Bitmap.createBitmap(Bitmap.java:640)
AndroidRuntime(2616):   at android.graphics.Bitmap.createBitmap(Bitmap.java:586) 
AndroidRuntime(2616):   at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:466)
AndroidRuntime(2616):   at com.rdx.gallery.GalleryDemoActivity.setSelectedImage(GalleryDemoActivity.java:183)
4

3 に答える 3

26

次のコードは例外を引き起こす可能性があることに注意することが重要です。

Bitmap bitmap = Bitmap.createScaledBitmap(oldBitmap, newWidth, newHeight, true); 
oldBitmap.recycle();

適切なもの:

Bitmap bitmap = Bitmap.createScaledBitmap(oldBitmap, newWidth, newHeight, true); 
if (oldBitmap!= bitmap){
     oldBitmap.recycle();
}

ドキュメントには次のように書かれているためです。

指定された幅と高さがソースbtimapの現在の幅と高さと同じである場合、ソースビットマップが返され、新しいビットマップが作成されます。

于 2013-11-11T13:01:24.450 に答える
13

http://www.youtube.com/watch?v=_CruQY55HOk。andorid 3.0ビットマップの後、ピクセルデータはヒープに保存されます。ヒープメモリサイズを超えているようです。アプリに大きなヒープが必要であるという理由だけで、大きなヒープを使用しないでください。ヒープのサイズが大きくなるほど、より定期的なガベージコレクションになります。ビデオには、このトピックに関する優れた説明があります。

また、使用していないときはビットマップをリサイクルしてください。ヒープ上のガベージコレクションは私のマークアンドスイープで行われるため、ビットマップをリサイクルするとメモリが解放されます。したがって、ヒープサイズが大きくなったり、メモリが不足したりすることはありません。

 bitmap.recycle();

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html。ビットマップを効率的にロードするためのドキュメント。縮小されたバージョンをメモリにロードする方法をご覧ください。

これとは別に、ユニバーサルイメージローダーを使用できます。https://github.com/nostra13/Android-Universal-Image-Loader

https://github.com/thest1/LazyList。画像の遅延読み込み。

どちらもキャッシュを使用します。

于 2013-03-21T16:02:39.370 に答える
5

あなたはあなたが持っているより多くのメモリにアクセスしようとしています。使用してみてください

 BitmapFactory.Options opts=new BitmapFactory.Options();
        opts.inDither=false;                    
        opts.inSampleSize = 8;                   
        opts.inPurgeable=true;                 
        opts.inInputShareable=true;             
        opts.inTempStorage=new byte[16 * 1024]; 

Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h1)
        , 65,65, true),

また、メモリを増やすために以下のリンクを見てください

http://developer.android.com/reference/android/R.styleable.html#AndroidManifestApplication_largeHeap

Androidでアプリケーションのヒープサイズを検出する

編集1

nostras image downloaderを使用してみてください。これを使用して、ローカルストレージに画像を表示できます。そしてそれはメモリを非常にうまく管理します...

https://github.com/nostra13/Android-Universal-Image-Loader

于 2013-03-21T15:51:02.510 に答える