我有ImageView&我的ImageActivity上有一个按钮。单击该按钮时,将列出可用图像,当单击其中一个图像时,它将加载到ImageView中。
imageView xml:
<ImageView
android:id="@+id/imageView"
android:layout_width="300dip"
android:layout_height="300dip"
android:src="@android:drawable/alert_light_frame"
/>
请参阅代码:
public class ImageActivity extends Activity {
private static final int SELECT_PICTURE = 1;
private String selectedImagePath;
private ImageView imageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.comments_detail);
imageView = (ImageView) findViewById(R.id.imageView);
((Button) findViewById(R.id.BtnBrowse))
.setOnClickListener(new OnClickListener()
{
public void onClick(View arg0)
{
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (resultCode == RESULT_OK)
{
if (requestCode == SELECT_PICTURE)
{
Uri selectedImageUri = data.getData();
selectedImagePath = getPath(selectedImageUri);
//System.out.println("Image Path : " + selectedImagePath);
imageView.setImageURI(selectedImageUri);
}
}
}
public String getPath(Uri uri)
{
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
}
问题问题是当我点击按钮时会显示可用的图像,我选择其中一个&amp;它被加载到ImageView中,当我重复这些步骤时,应用程序抛出几次抛出异常: java.lang.OutOfMemoryError:位图大小超过VM预算
我瞪着它&amp;发现这个问题是因为内存泄漏但我无法找到我的代码有什么问题。任何人都可以花一些宝贵的时间来帮助我吗?
感谢。
答案 0 :(得分:1)
如果您执行了一系列setImageURIs
,则会在视图中加载一系列位图。如果您收到java.lang.OutOfMemoryError: bitmap size exceeds VM budget exception
,则表示imageView
在您加载新位图时不会回收上一个位图。所以你
setImageView("")
setImageBitmap(android.graphics.Bitmap)
;然后你可以setImageBitmap(null)
和bitmap.recycle()
。答案 1 :(得分:-1)
打电话 system.gc()有效!! 在将图像分配给imageView之前,我调用了System.gc()来处理内存和处理内存。有用。
查看修改后的代码:
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (resultCode == RESULT_OK)
{
if (requestCode == SELECT_PICTURE)
{
// calling GC to take care of memory, if you remove this one line of code
// application will throw the error "VM out of memory error"
System.gc();
Uri selectedImageUri = data.getData();
selectedImagePath = getPath(selectedImageUri);
imageView.setImageURI(selectedImageUri);
}
}
}
感谢@Torid。
有人可以评论吗?这是在这种情况下调用GC的正确方法吗?