更改ImageView内容会导致OutOfMemoryError

我有一个非常简单的应用程序与一个ImageView和一个button。 我的ImageView加载的第一个Drawable资源是在XML Layout中用“android:src”标签指定的,但是在运行时我想改变它显示的图片 。 要做到这一点,我开始一个活动的结果从SD卡(意向发送到MediaStore.Images.Media.EXTERNAL_CONTENT_URI)select一个图像。 但是,当图片被选中,我尝试更新ImageView的图片的URI,但我得到的消息“ java.lang.OutOfMemoryError:位图大小超过VM预算

我试图加载与我的HTC – 英雄的照相机(图片大小约为1.1M)拍摄的照片,但没有成功,似乎只适用于小于500KB的图片。但是,我需要加载使用相机拍摄的照片。 我如何解决这个问题? 我究竟做错了什么。 在我看来,代码是非常简单的,应该工作。

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 } } 

PS是唯一的应用程序应该做的,我不创build其他对象,所以我想指出,我不使用堆空间除了显示图像以外的其他东西。

Solutions Collecting From Web of "更改ImageView内容会导致OutOfMemoryError"

好像之前加载一个新的位图,我不得不回收ImageView显示的位图,现在它工作没有问题。 希望这可以帮助别人,在设置新的ImageView的内容之前调用folowing方法。

((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的位图上调用回收站。

这让我疯狂。

我正在build立一个非常大,高分辨率,全屏幕图像(800×1232)的Xoom。

下面的代码为我工作:

 public void onStop() { super.onStop(); imageView.setImageBitmap(null); } 

祝你好运!!!

问题现在已经解决了。 而不是只有一行:

 ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle(); 

在更新ImageView内容之前添加此代码:

 Drawable toRecycle= gallerypic.getDrawable(); if (toRecycle != null) { ((BitmapDrawable)gallerypic.getDrawable()).getBitmap().recycle(); } gallerypic.setImageURI(selectedimage); 

只有在更新之前使用这个imageview:imageView1.setImageURI(null);

我用这个post的每个解决scheme和更多,但没有人工作。最后我在清单中使用android:largeHeap="true" ,并解决了我的问题。

希望这有助于某人。