Java 在gridview中显示图像时超出内存
我有一个活动,其中包含一个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
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"