非常普遍的问题,但我的问题有点不同,我找不到其他主题的解决方案,所以我在这里发布了新的。我有一个显示列表视图的应用程序。ListView的每一行,我都有一个ImageView,可以使用ListAdapter从SD卡加载一个小位图图标(它很小,所以问题不在于大小)。现在,如果我缓慢滚动列表,它可以正常工作。但是,如果我滚动得非常快,当 ListView 足够长时,它不再显示图标,logcat 中的消息如下所示:
126 600-byte external allocation too large for this process.
VM 不允许我们分配 126,600 字节
然后应用程序崩溃和日志猫显示:
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
我在 2 个不同的设备上进行了测试,其中只有 1 个出现此错误,另一个工作正常。请注意,此错误仅在列表视图滚动速度非常快时发生。这是因为创建的新线程与垃圾收集的速度不匹配还是其他什么?在这种情况下,任何人都可以给我一些建议吗?
在使用位图时,当与ListView一起使用时,您通常会得到内存不足。
所以你应该去LasyList,如下所示。
威尔会负责您的图像加载。
要使用 SDCard,您需要替换 ImageLoader 类中的方法,如下所示
private Bitmap getBitmap(String url)
{
// If is from SD Card
try {
File file = new File(url);
if(file.exists())
{
return BitmapFactory.decodeFile(url);
}
} catch (Exception e) {
}
File f=fileCache.getFile(url);
//from SD cache
Bitmap b = decodeFile(f);
if(b!=null)
return b;
//from web
try {
Bitmap bitmap=null;
URL imageUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setInstanceFollowRedirects(true);
InputStream is=conn.getInputStream();
OutputStream os = new FileOutputStream(f);
Utils.CopyStream(is, os);
os.close();
bitmap = decodeFile(f);
return bitmap;
} catch (Exception ex){
ex.printStackTrace();
return null;
}
}