我正在实现一个Android应用程序,其中我将图像附加到问题。这些附件有两种类型,
使用相机附件 来自图库的照片附件(画廊中已存在的照片) 我得到这些图像如下,
//Camera Request
Intent captureImage = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
captureImage.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
startActivityForResult(captureImage, CAMERA_PIC_REQUEST);
// Gallery Pic request
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, GALLERY_PIC_REQUEST);
上面的结果是URI。我将这个uri.getPath()保存在我的数据库中。
现在的问题是,当我想要显示这些图像时,我正在借助我所拥有的uri来获取它们。但是在加载第一张图片后我得到一个例外; java.lang.OutOfMemoryError:位图大小超过VM预算
我读了一些博客,我发现内存不足以加载它。
是否有人在列表中显示压缩图像时有工作解决方案并且在工作完成后使用回收内存?
答案 0 :(得分:0)
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
int bitmap_width = photoBitmap.getWidth();
int bitmap_height = photoBitmap.getHeight();
// where photoBitmap is your Bitmap image
if(bitmap_width >width)
bitmap_width = width ;
if(bitmap_height>height)
bitmap_height = height ;
// compressing bitmap goes here
photoBitmap = Bitmap.createScaledBitmap (photoBitmap, width, height, false);
答案 1 :(得分:0)
如果要加载或下载大量数据并将其直接存储在堆空间中,则内存不足。您可以通过以块为单位加载数据和/或缓存数据来避免这种情况。此外,删除不再使用的对象,因为只要有对它们的引用,它们将占用您的部分内存。您还可以将位图的大小调整为较小的尺寸,以便在您进行操作时节省空间。
您应该假设您的最大堆大小为16 MB,因为这是Android为某些旧版本设置的限制,即使运行较新版本的Android的设备可能具有更高的堆大小。或者,您可以使用http://developer.android.com/reference/android/app/ActivityManager.html#getMemoryClass()。
获取内存限制指南答案 2 :(得分:0)
如果要加载或下载大量数据并将其直接存储在堆空间中,则内存不足。您可以通过以块为单位加载数据和/或缓存数据来避免这种情况。此外,删除不再使用的对象,因为只要有对它们的引用,它们将占用您的部分内存。您还可以将位图的大小调整为较小的尺寸,以便在您进行操作时节省空间。