【发布时间】:2013-04-29 05:01:45
【问题描述】:
我正在开发一个媒体播放器应用程序,并希望加载专辑封面图像以显示在 ListView 中。现在它适用于我从 last.fm 自动下载的小于 500x500 png 的图像。但是,我最近在我的应用程序中添加了另一个面板,允许查看全屏艺术作品,因此我用大 (1024x1024) png 替换了我的一些艺术作品。
现在,当我滚动浏览几张具有高分辨率艺术品的专辑时,我的 BitmapFactory 上出现 java.lang.OutOfMemoryError。
static public Bitmap getAlbumArtFromCache(String artist, String album, Context c)
{
Bitmap artwork = null;
File dirfile = new File(SourceListOperations.getAlbumArtPath(c));
dirfile.mkdirs();
String artfilepath = SourceListOperations.getAlbumArtPath(c) + File.separator + SourceListOperations.makeFilename(artist) + "_" + SourceListOperations.makeFilename(album) + ".png";
File infile = new File(artfilepath);
try
{
artwork = BitmapFactory.decodeFile(infile.getAbsolutePath());
}catch(Exception e){}
if(artwork == null)
{
try
{
artwork = BitmapFactory.decodeResource(c.getResources(), R.drawable.icon);
}catch(Exception ex){}
}
return artwork;
}
我可以添加什么来限制生成的位图对象的大小,比如 256x256?缩略图需要更大,我可以创建一个重复的函数或一个参数来获取全尺寸的艺术品以全屏显示。
另外,我将这些位图显示在很小的 ImageView 上,大约 150x150 到 200x200。较小的图像比大的图像更容易缩小。有没有办法应用缩小过滤器来平滑图像(也许是抗锯齿)?如果不需要的话,我不想缓存一堆额外的缩略图文件,因为这会使管理艺术品图像变得更加困难(目前您可以将新的文件转储到目录中,下次将自动使用它们它们被加载)。
完整代码位于 src/com/calcprogrammer1/calctunes/AlbumArtManager.java 中的 http://github.org/CalcProgrammer1/CalcTunes,尽管其他函数没有太大不同(如果图像丢失,则返回检查 last.fm)。
【问题讨论】:
-
使用惰性列表或通用图像加载器。连同这个developer.android.com/training/improving-layouts/…。惰性列表和 UIL 加载位图的缩小版本。 stackoverflow.com/questions/15621936/whats-lazylist
标签: android image bitmap out-of-memory bitmapfactory