我有一个非常简单的应用程序,只有一个ImageView和Button。我的ImageView加载的第一个可绘制资源是在XML布局中使用"android:src“标记指定的,但是在运行时,我希望更改它显示的图片。为此,我启动了一个活动,以便从sd卡中选择一个图像(意图发送到MediaStore.Images.Media.EXTERNAL_CONTENT_URI). )。然而,当图片被选中时,我尝试用所选图片的URI更新ImageView,但是我得到消息"java.lang.OutOfMemoryError:位图大小超过VM预算“
我试图加载我的宏达-英雄相机的照片(图片大小约为110万),但没有成功,似乎只工作在低于500KB.However的图片,我需要加载与相机拍摄的照片。,我怎么能解决这个问题?,我做错了什么?在我看来,代码很简单,应该可以工作。
public void onClick(View v){
Intent selectImageIntent=new Intent(Intent.ACTION_PICK ,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(selectImageIntent,1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==Activity.RESULT_OK){
Uri selectedImageUri = data.getData();
Log.i(TAG,"chosen image: "+selectedImageUri.toString());
ImageView imageView = (ImageView) this.findViewById(R.id.ImageView01);
imageView.setImageURI(selectedImageUri);//here I get the OutOfMemoryError
imageView.invalidate();
}else{
//canceled
}
}
附注:这是应用程序应该做的唯一事情,我没有创建其他对象,所以我想指出的是,除了显示图像之外,我不使用堆空间来处理其他东西。
发布于 2010-02-04 06:44:11
似乎在加载一个新的位图之前,我必须回收ImageView显示的位图,现在它可以正常工作了。希望这对其他人有所帮助,在设置新ImageView的内容之前,只需调用折叠方法即可。
((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();
因此,代码现在看起来如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode){
case INTENT_REQUEST_SELECT_IMAGE:
if(resultCode==Activity.RESULT_OK){
Uri selectedImageUri = data.getData();
Log.i(TAG,"selectedImageUri.getPath()"+selectedImageUri.getPath() );
ImageView imageView = (ImageView) this.findViewById(R.id.ImageView_of_text);
((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();
imageView.setImageURI(selectedImageUri);
imageView.invalidate();
}else{
//TODO define what to do in case the user canceled OCR or any other event
}
break;
default:
break;
}
}
请注意ImageView位图上的循环调用。
发布于 2011-03-11 16:55:06
这把我逼疯了。
我正在为Xoom构建一个非常大的、高分辨率的全屏图像(800x1232)。
以下代码适用于我:
public void onStop()
{
super.onStop();
imageView.setImageBitmap(null);
}
祝好运!
发布于 2010-10-14 17:01:02
这个问题现在已经解决了。而不仅仅是一行:
((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();
在更新ImageView内容之前添加以下代码:
Drawable toRecycle= gallerypic.getDrawable();
if (toRecycle != null) {
((BitmapDrawable)gallerypic.getDrawable()).getBitmap().recycle();
}
gallerypic.setImageURI(selectedimage);
https://stackoverflow.com/questions/2191407
复制相似问题