我写了一段代码,从互联网上下载图像并将它们缓存到缓存目录中。 它在辅助线程中运行。
{
String hash = md5(urlString);
File f = new File(m_cacheDir, hash);
if (f.exists())
{
Drawable d = Drawable.createFromPath(f.getAbsolutePath());
return d;
}
try {
InputStream is = download(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
if (drawable != null)
{
FileOutputStream out = new FileOutputStream(f);
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
bitmap.compress(CompressFormat.JPEG, 90, out);
}
return drawable;
} catch (Throwable e) { }
return null;
}
我使用此代码在ListView项目中加载图片,它工作正常。如果我删除第一个if(我从磁盘加载图像)它运行顺利(每次下载图片!)。如果我保留它,当你滚动列表视图时,你会感觉到图片从磁盘加载时有些滞后,为什么?
答案 0 :(得分:0)
要回答“为什么”这个问题,我在logcat中遇到了很多gc()消息。 Android在从磁盘解码文件之前分配内存,这可能导致垃圾收集,这对所有线程的性能都很痛苦。当您对jpeg进行编码时,可能会发生相同的情况。
对于解码部分,您可以尝试重用现有的位图,如果您有一个让Android解码图像到位。请查看以下代码段:
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = inSampleSize;
options.inJustDecodeBounds = false;
options.inMutable = true;
if (oldBitmap != null) {
options.inBitmap = oldBitmap;
}
return BitmapFactory.decodeFile(f.getAbsolutePath(), options);
答案 1 :(得分:-1)
http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/
在后台执行。(使用AsyncTask加载图片。)