Android 安卓画廊和大图片

Android 安卓画廊和大图片,android,memory,Android,Memory,OutOfMemoryException在安卓系统上真是个麻烦。 目前我有一个Gallery小部件,其中我设置了30个256x256px图像,使用BaseAdapter显示它们 在某些情况下,如果我想将ArrayList列表作为数据加载到库中,那么每秒钟都会尝试一次应用程序崩溃。 我知道在内存中保留30个位图是愚蠢的,但还有什么选择呢。我在参考资料中有它们,我需要它们在画廊中展示 更新(适配器): public class MyGalleryAdapter extends BaseAdapter

OutOfMemoryException
在安卓系统上真是个麻烦。
目前我有一个Gallery小部件,其中我设置了30个256x256px图像,使用BaseAdapter显示它们

在某些情况下,如果我想将
ArrayList
列表作为数据加载到库中,那么每秒钟都会尝试一次应用程序崩溃。
我知道在内存中保留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)
公共类MyGalleryAdapter扩展了BaseAdapter{
私有上下文;
private ArrayList data=new ArrayList();
公共GalleryItemsAdapter(上下文){
mContext=上下文;
}
public int getCount(){
返回data.size();
}
公共数据持有者getItem(内部位置){
返回数据。获取(位置);
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutFlater充气机=LayoutFlater.from(mContext);
convertView=充气机。充气(R.layout.single_item,空);
ImageView imgView=(ImageView)convertView.findViewById(R.id.single\u item\u image\u view);
setImageBitmap(data.get(position).bitmap);
返回视图;
}
公共void setData(ArrayList数据){
这个数据=数据;
}
}
私有类MyDataObject{
公共字符串标题;
公共位图图像;
}
}
更新(错误):

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)
I/dalvikvm(9073):“主”优先级=5 tid=1可运行
I/dalvikvm(9073):| group=“main”scont=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)utm=437 stm=30 core=1
I/dalvikvm(9073):位于android.graphics.Bitmap.nativeCreate(本机方法)
I/dalvikvm(9073):位于android.graphics.Bitmap.createBitmap(Bitmap.java:605)
I/dalvikvm(9073):位于android.graphics.Bitmap.createBitmap(Bitmap.java:551)
I/dalvikvm(9073):位于android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
I/dalvikvm(9073):位于android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
I/dalvikvm(9073):位于android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
I/dalvikvm(9073):位于android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
I/dalvikvm(9073):位于android.graphics.drawable.drawable.createFromResourceStream(drawable.java:773)
I/dalvikvm(9073):位于android.content.res.Resources.loadDrawable(Resources.java:1937)
I/dalvikvm(9073):位于android.content.res.TypedArray.getDrawable(TypedArray.java:601)
I/dalvikvm(9073):位于android.view.view.(view.java:2780)
I/dalvikvm(9073):位于android.view.view.(view.java:2717)
I/dalvikvm(9073):位于android.view.ViewGroup(ViewGroup.java:379)
I/dalvikvm(9073):位于android.widget.RelativeLayout.(RelativeLayout.java:174)
I/dalvikvm(9073):位于java.lang.reflect.Constructor.constructNative(本机方法)
I/dalvikvm(9073):位于java.lang.reflect.Constructor.newInstance(Constructor.java:417)

为图像创建缩略图

Thumbnails.getThumbnail(cr, origId, kind, options);

我猜这里有什么问题:

在适配器的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;
}

您应该在android开发网站上阅读这篇关于如何处理位图和内存错误的文章


同时发布适配器。我不使用MediaLibrary。我从资源中获取文件。