android中listview,gridview加载图片的线程并发解决方案

所需积分/C币:10 2012-12-07 15:28:35 171KB PDF
收藏 收藏
举报

android中listview,gridview加载图片的线程并发解决方案
@Override // Once the image is downloaded, associates it to the imageView protected void onPostExecute(Bitmap bitmap) if (isCancelledo)( bitmap null if (imageViewReference !-null) ImageView image View imageViewReference getO f(image View ! =null)i imageView. set ImageBitmap(bitmap 这个 BitmapDownloader task里面的 do background方法是在子线程运行,而 npos execute是在主线程运行, doInBackground 执行的结果返回给 onpostexecuto。关于更多的 AsyncTask相关技术和参考 android的帮助文档(这个技术点不是本章要讨论的内 容) 到目前为止,我们已经可以实现了通过异步任务去网络下载图片,并显示在 1 magev lew上的功能了。 多线程并发处理 在上面中虽然我们实现了子线程下载图片并显小在 imagevlew的功能,但是在 listview等容器中,当用户随意滑动的时候, 将会产生N个线稈去下载图片,这个是我们不想看到的。我们希望的是一个图片只有一个线稈去下载就行了。 为∫解决这个问题,我们应该做的是让这个 pageview记住它是杳正在加载(或者说是下载)k络的图片资源。如果正在加载,或 者加载完成,那么我就不应该再建立一个任务去加载图片了。 现在我们把修改如下 public class ImageLoader public void load Image(String url, ImageView image View)( if (cancelPotentialDownload (url, imageView)) BitmapDownloaderTask task new BitmapDownloaderTask(image View) DownloadedDrawable downloadedDrawable= new DownloadedDrawable(task) image View. setImageDrawable( downloadedDrawable) task. execute(url, cookie) 首先我们先通过 cancelpotentialdownload方法去判断 imagevicw是否有线程正在为它下载图片资源,如果有现在正在下载, 那么判断卜载的这个图片资源(ur1)是否和现在的图片资源一样,不一样则取消之前的线程(之前的下载线程作废)。 cancelPotentialDownload方法代码如下 private static boolean cancelPotentialDownload(String url, ImageView imageView)[ BitmapDownloader Task bitmap Downloader Task =<span style- color: #cc0000; >gelBi tmapDownloaderTask(imageView); /span> f(bitmapDownloaderTask !-nul1) String bitmapUrl= bitmapDownloaderTask url if ((bitmapUrl -= null)(!bitmapUrl equals(ur1)))i Span style="color: #ff6666; bitmapDownloaderTask cancel(true); /span> else < span style-" color:#ff0000y>//相同的ur1已经在下载中 return false;</span〉 return true 当 bitmapDownloader Task. cancel(true)被执行的时候,则 Bi tmapDownloader Task就会被取消,当 BitmapDownloader Task的 执行到 onlostexecute的时侯,如果这个仁务加载到了图片,它也会把这个 b i tmap设为nul了 getBitmapDownloaderTask代码如下: privale static Bi LmapDownloader Task ge tBi tmapDownloader Task(ImageView image View)( if (imageView ! null) Drawable drawable= image View. getDrawableo if (drawable instanceof DownloadedDrawable) i DownloadedDrawable downloadedDrawable=(DownloadedDrawable)drawable return downloadedDrawable ge LBi LmapDownloader Task ( return null Down loadeddrawable是我们自定义的一个类,它的主要功能是记录了下载的任务,并被设置到 1.gel ew中,代码如下: static class DownloadedDrawable extends ColorDrawable private final WeakReference(BitmapDownloaderTask, bitmapDownloaderTaskReference public DownloadedDrawable(BitmapDownloader Task bitmapDownloader Task super (Color. BLACK bitmapDownloaderTaskReference new WeakReference(BitmapDownloaderTask>(bitmapDownloaderTask) public Bitmap DownloaderTask getBitmapDownloader) return bitmapDownloaderTaskReference geto 最后,我们回来修改 Bi tmapDownloadcr Task的 on Post execute方法 if (imageViewReference !)( Image View imageView imageViewReference geto BitmapDownloader Task bi tmapDownloader Task= ge tBi umapDownloaderTask(imageView // Change bitmap only if this process is still associated with it if (this=-bitmapDownloaderTask)( image View. setImageBitmap(bitmap)

...展开详情
试读 5P android中listview,gridview加载图片的线程并发解决方案
立即下载 低至0.43元/次 身份认证VIP会员低至7折
    一个资源只可评论一次,评论内容不能少于5个字
    陆涛 真的是不错,给予一个初学者很好的示范性总结~
    2013-10-14
    回复
    天天积分 顶一下。源码写的不错。
    2013-02-25
    回复
    天堂神龟 不错,,跑起来看了小效果
    2013-01-22
    回复
    a162109382 很不错了能跑起来
    2013-01-14
    回复
    小王子代码 好像能够跑起来额,不错
    2013-01-07
    回复
    • 领英

      绑定领英第三方账户获取
    • GitHub

      绑定GitHub第三方账户获取
    • 脉脉勋章

      绑定脉脉第三方账户获得
    • 分享王者

      成功上传51个资源即可获取
    关注 私信 TA的资源
    上传资源赚积分,得勋章
    最新推荐
    android中listview,gridview加载图片的线程并发解决方案 10积分/C币 立即下载
    1/5
    android中listview,gridview加载图片的线程并发解决方案第1页
    android中listview,gridview加载图片的线程并发解决方案第2页

    试读已结束,剩余3页未读...

    10积分/C币 立即下载 >