0

これOutOfMemoryExceptionは、Android では本当に面倒なことです。
現在、30 個の 256x256px の画像を設定し、BaseAdapter を使用して表示するギャラリー ウィジェットがあります。

いくつかの時点で、たとえば、ArrayList<Bitmap>リストをデータとしてギャラリーにロードしようとすると、アプリケーションがクラッシュします。
メモリに 30 個のビットマップを保持するのはばかげていることはわかっていますが、別の方法はありますか。リソースにそれらがあり、ギャラリーに表示する必要があります。

更新 (アダプター):

public class MyGalleryAdapter extends BaseAdapter {
    private Context mContext;
    private ArrayList<MyDataObject> data = new ArrayList<MyDataObject>();

    public GalleryItemsAdapter(Context context) {
        mContext = context;
    }

    public int getCount() {
        return data.size();
    }

    public DataHolder getItem(int position) {
        return data.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        convertView = inflater.inflate(R.layout.single_item, null);

        ImageView imgView = (ImageView) convertView.findViewById(R.id.single_item_image_view);
        imgView.setImageBitmap(data.get(position).bitmap);

        return convertView;
    }

    public void setData(ArrayList<MyDataObject> data) {
        this.data = data;
    }
}

    private class MyDataObject {
        public String title;
        public Bitmap image;
    }
}

更新 (エラー):

I/dalvikvm( 9073): "main" prio=5 tid=1 RUNNABLE
I/dalvikvm( 9073):   | group="main" sCount=0 dsCount=0 obj=0x40a3c460 self=0x12828
I/dalvikvm( 9073):   | sysTid=9073 nice=0 sched=0/0 cgrp=default handle=1074185352
I/dalvikvm( 9073):   | schedstat=( 0 0 0 ) utm=437 stm=30 core=1
I/dalvikvm( 9073):   at android.graphics.Bitmap.nativeCreate(Native Method)
I/dalvikvm( 9073):   at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
I/dalvikvm( 9073):   at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
I/dalvikvm( 9073):   at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
I/dalvikvm( 9073):   at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
I/dalvikvm( 9073):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
I/dalvikvm( 9073):   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
I/dalvikvm( 9073):   at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
I/dalvikvm( 9073):   at android.content.res.Resources.loadDrawable(Resources.java:1937)
I/dalvikvm( 9073):   at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
I/dalvikvm( 9073):   at android.view.View.<init>(View.java:2780)
I/dalvikvm( 9073):   at android.view.View.<init>(View.java:2717)
I/dalvikvm( 9073):   at android.view.ViewGroup.<init>(ViewGroup.java:379)
I/dalvikvm( 9073):   at android.widget.RelativeLayout.<init>(RelativeLayout.java:174)
I/dalvikvm( 9073):   at java.lang.reflect.Constructor.constructNative(Native Method)
I/dalvikvm( 9073):   at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
4

3 に答える 3

0

画像のサムネイルを作成します。

Thumbnails.getThumbnail(cr, origId, kind, options);
于 2012-05-14T08:13:42.167 に答える
0

ここで何が問題なのかを推測します:

アダプタの onCreateView メソッドでは、いずれにしても新しいビューを作成します。

やりたいことは、パラメーターで指定されたビューが既に作成されているかどうかを確認することです。

@override
public abstract View getView (int position, View convertView, ViewGroup parent){
if(view==null)
   // inflate the view 
else{
   // use view how it is
 }

.......
return view;
}
于 2012-05-14T08:16:31.710 に答える
0

ビットマップとメモリ エラーの処理方法については、Android 開発サイトのこの記事をお読みください。

http://developer.android.com/training/displaying-bitmaps/index.html

于 2012-05-14T08:16:41.767 に答える