0

我正在尝试加载并显示一个显示多张照片缩略图的屏幕。当我尝试将它们全部加载为位图时,我经常会收到 OutOfMemoryError,因为位图有点大,并且根据屏幕尺寸我要加载 10-20 个。照片的大小并不完全相同,因此取决于我要显示的子集,内存可能足以或可能不足以加载它们,这使我的应用程序不规律地崩溃(有时它会在用户滚动时崩溃)正在滚动照片网格)。

注意:由于我显示的是缩略图,我实际上并不要求加载的位图以全分辨率显示。有没有办法在加载位图之前告诉它的大小,还有,有没有办法在磁盘上加载位图的“预览”或下采样版本,这样我就可以节省内存并避免撞到内存限制?

4

1 回答 1

4

是的,当您通过 加载位图时BitmapFactory,您可以使用BitmapFactory.Options指定您只想检查位图的类型、宽度和高度:

// Read bitmap size and type only
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imagePath, options);

int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;

BitmapFactory.Options 还允许您指定要加载位图的下采样版本;您所要做的就是指定 inSampleSize,它是下采样因子(使用 2 加载一半宽度和一半高度的图像——因此具有大约 1/4 的内存占用)。因此,在您的情况下,您所要做的就是根据缩略图大小计算适当的下采样因子,并加载下采样的图像:

// (continuing from previous block of code)    

// Calculate downsample factor
options.inSampleSize = /* calculate downsample factor here as appropriate */

// Load a downsampled bitmap according to factor calculated above
options.inJustDecodeBounds = false;
Bitmap myBitmap = BitmapFactory.decodeResource(res, resId, options);

此外,如果您的列表滚动,那么您可能应该实施一种智能策略来释放您不再在屏幕上显示的位图。结合这种技术,这应该可以解决你的问题OutOfMemoryError

有关这方面的更多信息,请查看 Android Training 上的这个课程,它提供了这些(以及许多其他)实用技巧,以确保您的应用程序正确加载、显示和处理位图:

http://developer.android.com/training/displaying-bitmaps/index.html

于 2012-04-12T15:21:43.587 回答