Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在gridview中显示图像时超出内存_Java_Android - Fatal编程技术网

Java 在gridview中显示图像时超出内存

Java 在gridview中显示图像时超出内存,java,android,Java,Android,我有一个活动,其中包含一个gridview,用于通过相机或多媒体资料显示图像,但我发现它可能会导致OutOfMemory异常有时,这是代码,我不确定问题出在哪里 public class WaterPointSubmitActivity extends Activity { private final int DIALOG_TYPE_IMAGE = 11; private final int Result_Code_Camera = 11; private final

我有一个活动,其中包含一个gridview,用于通过相机或多媒体资料显示图像,但我发现它可能会导致
OutOfMemory
异常有时,这是代码,我不确定问题出在哪里

public class WaterPointSubmitActivity extends Activity {

    private final int DIALOG_TYPE_IMAGE = 11;

    private final int Result_Code_Camera = 11;
    private final int Result_Code_Local = 12;

    private final int Dialog_Source_Value_TakePhoto = 0; // the index in the array.xml
    private final int Dialog_Source_value_Local = 1;


    private ArrayList<String> mGridViewImages = new ArrayList<String>();
    private GridView mGridView;

    private ImageAdapter mGridViewAdapter;
    private ImageView mImageAddButton;
    private Uri mPhotoToBeUploadURI;


    private AsyncHttpClient mAsyncHttpClient = Helper.getAsyncHttpClient();
    private RequestHandle mCurrentRequset;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_point_submit);
        this.setupViews();
    }

    private void setupViews() {
        mGridView = (GridView) findViewById(R.id.images_grid_view);
        mGridViewAdapter = new ImageAdapter(this, R.layout.common_expose_image_item, mGridViewImages);
        mGridView.setAdapter(mGridViewAdapter);

        //trigger the image choose dialog
        mImageAddButton = (ImageView) findViewById(R.id.pollution_add_image);
        mImageAddButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showDialog(DIALOG_TYPE_IMAGE);
            }
        });
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        switch (id) {
            case DIALOG_TYPE_IMAGE:
                builder.setTitle(getString(R.string.dialog_choose_photo)).setItems(R.array.point_image_source, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                            case Dialog_Source_Value_TakePhoto:
                                //get image by camera
                                mPhotoToBeUploadURI = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
                                Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoToBeUploadURI);

                                startActivityForResult(cameraIntent, Result_Code_Camera);
                                break;
                            case Dialog_Source_value_Local:
                                //from gallery 
                                Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
                                photoPickerIntent.setType("image/*");
                                startActivityForResult(photoPickerIntent, Result_Code_Local);
                                break;
                        }
                    }
                });
                Dialog target = builder.create();
                target.setCanceledOnTouchOutside(false);
                return target;
        }
        return null;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
        if (resultCode == RESULT_OK) {
            String imageFile = null;
            switch (requestCode) {
                case Result_Code_Camera:
                    String[] projection = {
                            MediaStore.MediaColumns._ID,
                            MediaStore.Images.ImageColumns.ORIENTATION,
                            MediaStore.Images.Media.DATA
                    };
                    Cursor c = getContentResolver().query(mPhotoToBeUploadURI, projection, null, null, null);
                    c.moveToFirst();
                    imageFile = c.getString(c.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
                    break;
                case Result_Code_Local:
                    Uri selectedImage = imageReturnedIntent.getData();
                    String[] filePathColumn = {MediaStore.Images.Media.DATA};

                    Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
                    cursor.moveToFirst();

                    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                    imageFile = cursor.getString(columnIndex);
                    cursor.close();
                    break;
            }
            mGridViewImages.add(imageFile);
            mGridViewAdapter.notifyDataSetChanged();
        }
    }

    class ImageAdapter extends ArrayAdapter<String> {
        private int mResourceId;

        public ImageAdapter(Context context, int resource, List<String> items) {
            super(context, resource, items);
            mResourceId = resource;
        }

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

            if (convertView == null || convertView.getTag() == null) {
                convertView = getLayoutInflater().inflate(mResourceId, parent, false);

                holder = new ViewHolder();
                holder.pointImage = (ImageView) convertView.findViewById(R.id.pollution_image);
                holder.pointDeleteImage = convertView.findViewById(R.id.pollution_image_delete);
                convertView.setTag(holder);
                holder.pointDeleteImage.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        deleteImage(position);
                    }
                });
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            String filePath = getItem(position);
            if (filePath != null) {
                Bitmap bitmap = BitmapFactory.decodeFile(filePath);
                holder.pointImage.setImageBitmap(bitmap);
            }
            return convertView;
        }
    }

    private void deleteImage(int position) {
        mGridViewImages.remove(position);
        mGridViewAdapter.notifyDataSetChanged();
    }

    static class ViewHolder {
        ImageView pointImage;
        View pointDeleteImage;
    }
}
公共类WaterPointSubmitActivity扩展活动{
私有最终整数对话框类型图像=11;
私人最终int结果\代码\摄像机=11;
私有最终整数结果\代码\本地=12;
private final int Dialog\u Source\u Value\u TakePhoto=0;//array.xml中的索引
私有最终整数对话框\u源\u值\u本地=1;
私有ArrayList mGridViewImages=新ArrayList();
私有网格视图mGridView;
专用ImageAdapter mGridViewAdapter;
私有图像查看mimageadd按钮;
私有Uri mPhotoToBeUploadURI;
私有AsyncHttpClient mAsyncHttpClient=Helper.getAsyncHttpClient();
私有请求句柄mcurrentreqset;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.layout\u point\u submit);
这是setupViews();
}
私有void setupViews(){
mGridView=(GridView)findviewbyd(R.id.images\u grid\u视图);
mGridViewAdapter=新的ImageAdapter(此,R.layout.common\u expose\u image\u项,mGridViewImages);
setAdapter(mGridViewAdapter);
//触发图像选择对话框
mImageAddButton=(ImageView)findViewById(R.id.pollution\u add\u image);
mImageAddButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
showDialog(对话框类型图像);
}
});
}
@凌驾
受保护的对话框onCreateDialog(int id){
AlertDialog.Builder=新建AlertDialog.Builder(此);
开关(id){
案例对话框\u类型\u图像:
builder.setTitle(getString(R.string.dialog\u choose\u photo)).setItems(R.array.point\u image\u source,new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
开关(哪个){
案例对话框\来源\价值\拍照:
//用照相机拍摄图像
mPhotoToBeUploadURI=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,new ContentValues());
Intent cameraIntent=新的Intent(MediaStore.ACTION\u IMAGE\u CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_输出,mPhotoToBeUploadURI);
startActivityForResult(摄像机屏幕、结果代码和摄像机);
打破
案例对话框\u源\u值\u本地:
//来自画廊
意向照片采集器内容=新意向(意向.行动\u采集器);
photopickerinent.setType(“image/*”);
startActivityForResult(光采集器内容、结果代码和本地);
打破
}
}
});
Dialog target=builder.create();
target.setCanceledOnTouchOutside(false);
回报目标;
}
返回null;
}
@凌驾
ActivityResult上受保护的void(int-requestCode、int-resultCode、Intent-ImageReturnedContent){
if(resultCode==RESULT\u OK){
字符串imageFile=null;
开关(请求代码){
案例结果\u代码\u摄像机:
字符串[]投影={
MediaStore.MediaColumns.\u ID,
MediaStore.Images.ImageColumns.ORIENTATION,
MediaStore.Images.Media.DATA
};
游标c=getContentResolver().query(mPhotoToBeUploadURI,projection,null,null);
c、 moveToFirst();
imageFile=c.getString(c.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
打破
案例结果\u代码\u本地:
Uri selectedImage=imageReturnedIntent.getData();
字符串[]filePathColumn={MediaStore.Images.Media.DATA};
Cursor Cursor=getContentResolver().query(selectedImage,filePathColumn,null,null);
cursor.moveToFirst();
int columnIndex=cursor.getColumnIndex(filePathColumn[0]);
imageFile=cursor.getString(columnIndex);
cursor.close();
打破
}
mgridviewmages.add(图像文件);
mGridViewAdapter.notifyDataSetChanged();
}
}
类ImageAdapter扩展了ArrayAdapter{
私有资源;
公共ImageAdapter(上下文、int资源、列表项){
超级(上下文、资源、项目);
mResourceId=资源;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
ViewHolder=null;
if(convertView==null | | convertView.getTag()==null){
convertView=GetLayoutFlater()。充气(mResourceId,父项,false);
holder=新的ViewHolder();
holder.pointImage=(ImageView)convertView.findViewById(R.id.u图像);
holder.pointDeleteImage=convertView.findViewById(R.id.inclution\u image\u delete);
convertView.setTag(支架);
holder.pointDeleteImage.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
删除图像(位置);
}
});
}
BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inJustDecodeBounds = true;
                    BitmapFactory.decodeFile(selectedImagePath, options);
                    int imageHeight = options.outHeight;
                    int imageWidth = options.outWidth;
                    String imageType = options.outMimeType;

                        options.inSampleSize = calculateInSampleSize(options,320,480);


                    options.inJustDecodeBounds = false;
                    Bitmap photo = BitmapFactory.decodeFile(selectedImagePath,options);
public int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        // Calculate ratios of height and width to requested height and width
        final int heightRatio = Math.round((float) height / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);

        // Choose the smallest ratio as inSampleSize value, this will guarantee
        // a final image with both dimensions larger than or equal to the
        // requested height and width.
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }

    return inSampleSize;
    }
android:largeHeap="true"