1

基本的なアクティビティ(SherlockActivityサブクラス)があり、それがロードするビューには、単一の最大サイズのImageViewがあります。

<LinearLayout xmlns:p1="http://schemas.android.com/apk/res/android"
    p1:orientation="vertical"
    p1:minWidth="25px"
    p1:minHeight="25px"
    p1:layout_width="fill_parent"
    p1:layout_height="fill_parent"
    p1:id="@+id/linearLayout1">
    <ImageView
        p1:src="@android:drawable/ic_menu_gallery"
        p1:layout_width="fill_parent"
        p1:layout_height="fill_parent"
        p1:id="@+id/imageView"
        p1:scaleType="fitCenter" />
</LinearLayout>

アクティビティが行うのは、ビットマップをロードしてImageViewに割り当てることだけです。

var iv = FindViewById<ImageView>(Resource.Id.imageView);
iv.SetBitmapImage(BitmapFactory.decodeFile(file....))

ロード時にビットマップのサイズを変更する方法(http://developer.android.com/training/displaying-bitmaps/load-bitmap.html)を理解する前は、アプリまで、アクティビティをロードするたびに5MBのメモリを消費していました。クラッシュしました(現在はそうではありませんが、この問題はまだ残っていると思います)。私がこのようにしたとしても:

  • 親アクティビティで、ボタンをタップして子を開きます
  • 子(上の画像ビュー)では、戻るをタップします
  • 親では、開いた子
  • 子供の場合は、タップして戻します
  • クラッシュするまでなど(毎回5MBなので約4回!)

実際の質問:アクティビティが停止または破棄されたときに画像を破棄する予定ですか?私はJava(またはC#)で物事がGC化されていると思ったので、それを行う必要はありません。アクティビティのライフサイクルで何かが足りませんか?

両方の回答者が最終的に正しい回答を思いつきました(GCはそれを行いますが、recycle()を使用して強制することができます)。したがって、回答に含まれているものを正しくマークすると、他の人が見つけやすくなります。

4

2 に答える 2

6

recycle()ビットマップを呼び出してみてください。

http://developer.android.com/reference/android/graphics/Bitmap.html#recycle%28%29

于 2012-10-23T09:30:06.907 に答える
1

大きなビットマップをロードすると、OutOfMemoryErrorが発生する可能性があります。アプリに読み込む前に画像を縮小できます。それはより少ないメモリを消費します。あなたはここを見るかもしれません:https ://stackoverflow.com/a/13011614/1117338

于 2012-10-23T09:27:55.137 に答える