未在本地缓存java映像(使用通用映像加载程序)会降低映像加载时间
问题描述: 我正在创建一个带有缩略图的可滚动文章列表,该列表由我的SQLite数据库填充。一般来说,除了速度慢之外,它是“起作用的”:
图像加载非常慢。。。我认为使用“Universal Image Loader”将图像缓存在设备上,如果您已经查看了它们(或者至少已经接近了),那么这会使它们看起来像是滚动到视图中。但是-当你向上/向下拖动时,图像都不存在,然后3-5秒后,图像开始弹出(好像正在下载它们)
我正在动态地改变缩略图框的可见性,但这是完美的——它们看起来没有变化——它们只是滚动到视图中,没有闪烁或任何东西。(但接下来的几秒钟内图像都不会出现)
我已经通过在滚动后删除我的php脚本进行了测试。。。当我滚动回到prev spot时,图像不会显示——这让我假设每次都是从我的PHP脚本加载的
但根据the docs:“使用FreqLimitedMemoryCache(超过缓存大小限制时删除最不常用的位图)-默认情况下使用”
详细信息:
在我的ArticleEntryAdapter.js
中,我有:
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
// We need to get the best view (re-used if possible) and then
// retrieve its corresponding ViewHolder, which optimizes lookup efficiency
final View view = getWorkingView(convertView);
final ViewHolder viewHolder = getViewHolder(view);
final Article article = getItem(position);
// Set the title
viewHolder.titleView.setText(article.title);
//Set the subtitle (subhead) or description
if(article.subtitle != null)
{
viewHolder.subTitleView.setText(article.subtitle);
}
else if(article.description != null)
{
viewHolder.subTitleView.setText(article.description);
}
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage("", viewHolder.thumbView); //clears previous one
if(article.filepath != null && article.filepath.length() != 0) {
imageLoader.displayImage(
"http://img.sltdb.com/processes/resize.php?image=" + article.filepath + "&size=100&quality=70",
viewHolder.thumbView
);
viewHolder.thumbView.setVisibility(View.VISIBLE);
} else {
viewHolder.thumbView.setVisibility(View.GONE);
}
return view;
}
至于图片不正确-这并不常见,但有时在滚动时,我会看到2个相同的图片,当我看文章时,它们根本没有关联(即不可能实际拥有相同的图片),所以-我从它滚动,然后再滚动,它不再是不正确的图片
注意:我是Java/Android新手——你可能已经注意到了
每个评论请求的更多代码:
private View getWorkingView(final View convertView) {
// The workingView is basically just the convertView re-used if possible
// or inflated new if not possible
View workingView = null;
if(null == convertView) {
final Context context = getContext();
final LayoutInflater inflater = (LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
workingView = inflater.inflate(articleItemLayoutResource, null);
} else {
workingView = convertView;
}
return workingView;
}
更新: 我的清单文件有:
<uses-permission 安卓:name="安卓.permission.WRITE_EXTERNAL_STORAGE"/>
但我找到的缓存文件夹完全为空:
mnt
-sdcard
-Android
-data
-com.mysite.news
-cache
-uil-images
# 1 楼答案
我在列表视图中遇到了类似的图像问题。可能this answer会纠正错误的图像问题
我刚刚下载了带有UniversalImageLoader的示例项目,它显示了与您描述的相同的行为
到目前为止,还有一些注释没有通读源代码
这意味着,在任何时候都会有三个线程下载和最大2MB的图像。你下载的图像有多大?你也在缓存到磁盘吗?如果是这样,那将是缓慢的
要在ImageLoader中配置一些基本选项,您需要传入displayImage:
我还希望您尝试以下选项:
在我的测试中,映像在磁盘上,但加载速度仍然很慢
经过广泛的测试,我确定主要的问题是UniversalImageLoader速度太慢。具体地说,ImageLoader和LoadAndDisplayImageTask阻碍了工作。我(很快)将LoadAndDisplayImageTask重写为异步任务,它立即表现得更好。您可以在GitHub上下载代码的分叉版本
Universal Image Loader with AsyncTasks
# 2 楼答案
我怀疑会调整大小。php的速度很慢,尤其是当它必须调整大页面的大小并且接收到多个请求时。不知何故,imageLoader中的缓存没有完成
首先,在图像加载之后,我将执行其余的:字幕、描述和所有内容因为如果图像加载时间过长,如果描述和所有其他内容同时出现,则会产生更即时的效果。通常你的陈述顺序是好的
@CameronLowellPallmer的答案负责交换图像和缓存
# 3 楼答案
另一种解决方案是来自ignition开源项目的“RemoteImageView”
http://kaeppler.github.com/ignition-docs/ignition-core/apidocs/com/github/ignition/core/widgets/RemoteImageView.html
RemoteImageView有效地扩展了ImageView,并在幕后为您执行所有抓取/缓存操作
虽然它不一定能解决您列出的问题,但作为替代解决方案,它可能值得研究
编辑:如果你仍然需要远程图像解决方案,我强烈推荐毕加索。我已将应用程序中的RemoteImageView替换为毕加索:http://square.github.io/picasso/
# 4 楼答案
这门课对我很有用:
使用示例: