因此,一段时间以来,我一直在尝试用最佳方法在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最佳加载图像所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)