内存不足的异常,同时实施图库 [英] Out of memory exception while implementing image gallery

查看:111
本文介绍了内存不足的异常,同时实施图库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写一个code,以实现Android设备的小图像画廊。我的code如下。在code是工作,但它给了内存异常,请帮助。 IAM新鲜到Android。先谢谢了。

 公共类GalleryActivity延伸活动{
/ *
 *存储变量
 * /
私人诠释计数;
私人位图[]的缩略图;要显示//图像
私有String [] arrPath; //要显示的图像的路径
私人ImageAdapter imageAdapter; //设置如何被显示的图像光标imagecursor; //要通过移动查询
布局网格;/ *
 *显示在画廊的形式形象
 * /
@燮pressWarnings(德precation)
公共无效showGallery(){
    最终的String [] =列{MediaStore.Images.Media.DATA,MediaStore.Images.Media._ID};
    最后弦乐ORDERBY = MediaStore.Images.Media._ID;
    imagecursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                                列,
                                空值,
                                空值,
                                排序依据);
    INT image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Media._ID);
    this.count = imagecursor.getCount();
    this.thumbnails =新的位图[this.count]
    this.arrPath =新的String [this.count]
    GridView控件imagegrid =(GridView控件)findViewById(R.id.PhotoGrid);
    imageAdapter =新ImageAdapter();
    imagegrid.setAdapter(imageAdapter);    的for(int i = 0; I< this.count;我++){
        imagecursor.moveToPosition(ⅰ);
        INT ID = imagecursor.getInt(image_column_index);
        INT dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA);
        缩略图[I] = MediaStore.Images.Thumbnails.getThumbnail(
                getApplicationContext()。getContentResolver(),身份证,
                MediaStore.Images.Thumbnails.MICRO_KIND,NULL);
        arrPath [I] = imagecursor.getString(da​​taColumnIndex);    }
}
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    意向意图= getIntent(); //要从那里活性称为知道
    字符串行动= intent.getAction();
    字符串类型= intent.getType();
    showGallery();
}@覆盖
公共无效onLowMemory(){
    System.gc()的;
    的System.out.println(低内存$$$$$$$$$$$$$$$$$$$$$$$$$$$$$);
    super.onLowMemory();
}/ *
 *退出前注销所有资源
 * @see android.app.Activity#的onDestroy()
 * /
@覆盖
保护无效的onDestroy(){
    super.onDestroy();
    如果(imagecursor!= NULL){
        imagecursor.close();
    }
    如果(插座!= NULL){
        尝试{
            socket.close();
        }赶上(IOException异常五){
            e.printStackTrace();
        }
    }
}/ *
 *类别:ImageAdapter
 *描述:包含函数来填充在GridView以形成图像
 * /
公共类ImageAdapter延伸BaseAdapter {
    私人LayoutInflater mInflater;    公共ImageAdapter(){
        mInflater =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }    @覆盖
    公众诠释的getCount(){
        返回计数;
    }    @覆盖
    公共对象的getItem(INT位置){
        返回的位置;
    }    @覆盖
    众长getItemId(INT位置){
        返回的位置;
    }    @覆盖
    公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        ImageView的持有人;
        convertView = mInflater.inflate(
        R.layout.one_image,NULL);
        支架=(ImageView的)convertView.findViewById(R.id.PhotoImage);
        convertView.setTag(保持器);
        holder.setOnClickListener(新OnClickListener(){
            公共无效的onClick(视图v){
                INT ID = v.getId();
                的System.out.println(将String.valueOf(ID));
                意向意图=新意图(GalleryActivity.this,ViewImage.class);
                intent.putExtra(路径,arrPath [ID]);
                intent.putExtra(命令,上传);
                的System.out.println(arrPath [ID]);
                startActivity(意向);
            }
        });
        holder.setImageBitmap(缩略图[位置]);
        holder.setId(位置);
        返回convertView;
    }
} // ImageAdapter公共类SimpleGestureDetector扩展SimpleOnGestureListener实现OnClickListener {    私有静态最终诠释SWIPE_MIN_DISTANCE = 120;
    私有静态最终诠释SWIPE_MAX_OFF_PATH = 250;
    私有静态最终诠释SWIPE_THRESHOLD_VELOCITY = 200;    @覆盖
    公共布尔onDoubleTap(MotionEvent五){
        返回super.onDoubleTap(E);
    }    @覆盖
    公共无效的onClick(查看为arg0){    }    @覆盖
    公共布尔onFling(MotionEvent E1,E2 MotionEvent,浮velocityX,浮velocityY){
        尝试{
            如果(Math.abs(e1.getY() - e2.getY())> SWIPE_MAX_OFF_PATH)
                返回false;
            //从右向左轻扫
            如果(e1.getX() - e2.getX()> SWIPE_MIN_DISTANCE&放大器;&放大器; Math.abs(velocityX)GT; SWIPE_THRESHOLD_VELOCITY){            }否则如果(e2.getX() - e1.getX()> SWIPE_MIN_DISTANCE&放大器;&放大器; Math.abs(velocityX)GT; SWIPE_THRESHOLD_VELOCITY){
                的System.out.println(左);
            }
        }赶上(例外五){
            e.printStackTrace();
        }
        返回false;
    }
}} // GalleryActivity


解决方案

使用convertView不为null,然后尝试其他

  @覆盖
            公共查看getView(INT位置,查看convertView,父母的ViewGroup){
            ViewHolder holder2;
        如果(convertView == NULL){                holder2 =新ViewHolder();
                convertView = mInflater.inflate(
                R.layout.one_image,NULL);
                holder1 =(ImageView的)convertView.findViewById(R.id.PhotoImage);
                convertView.setTag(holder1);              }
           其他{            holder2 =(ViewHolder)convertView .getTag();
            }                返回convertView;
            }私有静态类ViewHolder {
        ImageView的holder1;    }

I am writing a code to implement a small image gallery in android device. My code is as follows. The code is working but it is giving out of memory exception please help. iam fresh to android. thanks in advance.

public class GalleryActivity extends Activity{
/*
 * Storage Variable
 */
private int count;
private Bitmap[] thumbnails;        //Images to be displayed
private String[] arrPath;           //Path of the images to be displayed
private ImageAdapter imageAdapter;  //Set how the images to be displayed

Cursor imagecursor;                 //To move through the query
Layout grid;

/*
 * Shows the Images in the form of a gallery
 */
@SuppressWarnings("deprecation")
public void showGallery() {
    final String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID };
    final String orderBy = MediaStore.Images.Media._ID;
    imagecursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                                columns,
                                null,
                                null, 
                                orderBy);
    int image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Media._ID);
    this.count = imagecursor.getCount();
    this.thumbnails = new Bitmap[this.count];
    this.arrPath = new String[this.count];
    GridView imagegrid = (GridView) findViewById(R.id.PhotoGrid);
    imageAdapter = new ImageAdapter();
    imagegrid.setAdapter(imageAdapter);

    for (int i = 0; i < this.count; i++) {
        imagecursor.moveToPosition(i);
        int id = imagecursor.getInt(image_column_index);
        int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA);
        thumbnails[i] = MediaStore.Images.Thumbnails.getThumbnail(
                getApplicationContext().getContentResolver(), id,
                MediaStore.Images.Thumbnails.MICRO_KIND, null);
        arrPath[i]= imagecursor.getString(dataColumnIndex);

    }
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = getIntent();            // To know from where the activity was called
    String action = intent.getAction();
    String type = intent.getType();
    showGallery();
}

@Override
public void onLowMemory() {
    System.gc();
    System.out.println("Low Memory $$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
    super.onLowMemory();
}

/*
 * Unregister every resource before exiting
 * @see android.app.Activity#onDestroy()
 */
@Override
protected void onDestroy() {
    super.onDestroy();
    if(imagecursor != null){
        imagecursor.close();
    }
    if(socket != null){
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

/*
 * Class        : ImageAdapter
 * Description  : Contains functions to populate the GridView to form an image
 */
public class ImageAdapter extends BaseAdapter {
    private LayoutInflater mInflater;

    public ImageAdapter() {
        mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return count;
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView holder;
        convertView = mInflater.inflate(
        R.layout.one_image, null);
        holder = (ImageView)convertView.findViewById(R.id.PhotoImage);
        convertView.setTag(holder);
        holder.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                int id = v.getId();
                System.out.println(String.valueOf(id));
                Intent intent = new Intent(GalleryActivity.this, ViewImage.class);
                intent.putExtra("path", arrPath[id]);
                intent.putExtra("command", "upload");
                System.out.println(arrPath[id]);
                startActivity(intent);
            }
        });
        holder.setImageBitmap(thumbnails[position]);
        holder.setId(position);
        return convertView;
    }
}// ImageAdapter

public class SimpleGestureDetector extends SimpleOnGestureListener implements OnClickListener{

    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        return super.onDoubleTap(e);
    }

    @Override
    public void onClick(View arg0) {

    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        try {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                return false;
            // right to left swipe
            if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

            }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                System.out.println("Left");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
}

}// GalleryActivity

解决方案

use convertView is not null then try to else

     @Override
            public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder2;
        if (convertView == null) {

                holder2 = new ViewHolder();
                convertView = mInflater.inflate(
                R.layout.one_image, null);
                holder1 = (ImageView)convertView.findViewById(R.id.PhotoImage);
                convertView.setTag(holder1);

              }
           else {

            holder2= (ViewHolder) convertView .getTag();
            }

                return convertView;
            }

private static class ViewHolder {
        ImageView holder1;

    }

这篇关于内存不足的异常,同时实施图库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆