如何从Android ListView中的URL最佳加载图像

如何从Android ListView中的URL最佳加载图像,第1张

概述因此,一段时间以来,我一直在尝试用最佳方法在Android的ListView中加载图像.图像来自服务器,因此可能需要一些时间来加载.据我了解,只有两种方法可以实现此目的:1-在主线程上加载图像-这会导致视图显示和滚动时立即显示正确的图像,但是滚动性能较差,并可能导致应用挂起和崩溃.2-将

因此,一段时间以来,我一直在尝试用最佳方法在Android的ListVIEw中加载图像.

图像来自服务器,因此可能需要一些时间来加载.据我了解,只有两种方法可以实现此目的:

1-在主线程上加载图像-这会导致视图显示和滚动时立即显示正确的图像,但是滚动性能较差,并可能导致应用挂起和崩溃.

2-将图像加载到AsyncTask中.这意味着列表显示或滚动时图像将为空白,但最终显示.由于列表完成了缓存,因此您还可以获得错误的图像.但这可以提供良好的性能和滚动效果,并且不会挂起/崩溃.

似乎两种解决方案均无法正常工作.必须有一个可行的解决方案??我看过其他这样的帖子,但答案似乎总是1或2,但都不是一个好的解决方案…

我的列表适配器代码如下.
httpGetimageAction.fetchImage()方法要么执行异步任务,要么根据我设置的标志在主线程上获取图像.加载图像后,我还会在本地和磁盘上高速缓存图像,因此该问题主要发生在第一次(但高速缓存仅适用于100张图像,并且列表有1000张).

public class Imagelistadapter extends ArrayAdapter<WebMediumConfig> {Activity activity;public Imagelistadapter(Activity activity, int resourceID, List<WebMediumConfig> items) {    super(activity, resourceID, items);    this.activity = activity;}class ImageListVIEwHolder {    ImageVIEw imageVIEw;    TextVIEw nameVIEw;    TextVIEw descriptionVIEw;    TextVIEw statVIEw;}public VIEw getVIEw(int position, VIEw convertVIEw, VIEwGroup parent) {    ImageListVIEwHolder holder = null;    WebMediumConfig config = getItem(position);    LayoutInflater mInflater = (LayoutInflater)this.activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);    if (convertVIEw == null) {        convertVIEw = mInflater.inflate(R.layout.image_List, null);        holder = new ImageListVIEwHolder();        holder.imageVIEw = (ImageVIEw)convertVIEw.findVIEwByID(R.ID.imageVIEw);        holder.nameVIEw = (TextVIEw) convertVIEw.findVIEwByID(R.ID.nameVIEw);        holder.descriptionVIEw = (TextVIEw)convertVIEw.findVIEwByID(R.ID.descriptionVIEw);        holder.statVIEw = (TextVIEw)convertVIEw.findVIEwByID(R.ID.statVIEw);        convertVIEw.setTag(holder);    } else {        holder = (ImageListVIEwHolder) convertVIEw.getTag();    }    holder.nameVIEw.setText(Utils.stripTags(config.name));    holder.descriptionVIEw.setText(Utils.stripTags(config.description));    holder.statVIEw.setText(config.stats());    if (MainActivity.showImages) {        httpGetimageAction.fetchImage(this.activity, config.avatar, holder.imageVIEw);    } else {        holder.imageVIEw.setVisibility(VIEw.GONE);    }    return convertVIEw;  }}

@R_502_6120@:

您永远不要在主线程上加载图像.任何网络调用都应异步进行,并且不应在主线程上进行.您的图像可能会快速加载(在主线程上),因为您可能具有良好的Internet连接,图像较小和/或图像较少.但是,想象一下,如果使用您的应用程序的人的互联网速度较慢,然后有一天您的列表增长到数百个,那会发生什么!

下面的方法是加载滚动视图内容的公认方法

> a)在加载滚动视图时加载文本内容.同样,加载应该异步完成,但是您可以显示加载视图,直到下载完成
> b)显示图片
图像在每个单元格上加载时的占位符
> c)加载图像
异步地

使用像Picasso这样的库将极大地帮助您,因为您需要处理很多样板代码,否则,例如

>重用单元时取消图像下载,并且
>为重复使用的单元格开始新的下载
>缓存
>重试失败的下载

希望这可以帮助.

总结

以上是内存溢出为你收集整理的如何从Android ListView中的URL最佳加载图像全部内容,希望文章能够帮你解决如何从Android ListView中的URL最佳加载图像所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1092182.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存