`
Darar
  • 浏览: 87851 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android图片异步加载 列表

 
阅读更多
package cn.jd3g.utils;  

002    

003 import java.lang.ref.SoftReference;  

004 import java.util.HashMap;  

005 import java.util.LinkedHashMap;  

006 import java.util.Map.Entry;  

007    

008 import android.graphics.Bitmap;  

009 import android.os.Handler;  

010 import android.util.Log;  

011 import android.widget.ImageView;  

012    

013 /**  

014  * 利用多线程异步加载图片并更新视图  

015  *   

016  * @author xfzhang  

017  *   

018  */ 

019 public final class AsynImageLoader {  

020    

021     private LoaderThread thread;// 加载图片并发消息通知更新界面的线程  

022     private HashMap<String, SoftReference<Bitmap>> imageCache;// 图片对象缓存,key:图片的url  

023     private Handler handler;// 界面Activity的Handler对象  

024    

025     public AsynImageLoader(Handler handler) {  

026         imageCache = new HashMap<String, SoftReference<Bitmap>>();  

027         this.handler = handler;  

028     }  

029    

030     /**  

031      * 加载图片前显示到指定的ImageView中,图片的url保存在视图对象的Tag中  

032      *   

033      * @param imageView  

034      *            要显示图片的视图  

035      * @param defaultBitmap  

036      *            加载需要显示的提示正在加载的默认图片对象  

037      */ 

038     public void loadBitmap(ImageView imageView, Bitmap defaultBitmap) {  

039         // 图片所对应的url,这个值在加载图片过程中很可能会被改变  

040         String url = (String) imageView.getTag();  

041         if (imageCache.containsKey(url)) {// 判断缓存中是否有  

042             SoftReference<Bitmap> softReference = imageCache.get(url);  

043             Bitmap bitmap = softReference.get();  

044             if (bitmap != null) {// 如果图片对象不为空,则可挂接更新视图,并返回  

045                 imageView.setImageBitmap(bitmap);  

046                 return;  

047             } else {// 如果为空,需要将其从缓存中删除(其bitmap对象已被回收释放,需要重新加载)  

048                 Log.e("TAG", "cache bitmap is null");  

049                 imageCache.remove(url);  

050             }  

051         }  

052         imageView.setImageBitmap(defaultBitmap);// 先显示一个提示正在加载的图片  

053         if (thread == null) {// 加载线程不存在,线程还未启动,需要新建线程并启动  

054             thread = new LoaderThread(imageView, url);  

055             thread.start();  

056         } else {// 如果存在,就调用线程对象去加载  

057             thread.load(imageView, url);  

058         }  

059    

060     }  

061    

062     /**  

063      * 释放缓存中所有的Bitmap对象,并将缓存清空  

064      */ 

065     public void releaseBitmapCache() {  

066         if (imageCache != null) {  

067             for (Entry<String, SoftReference<Bitmap>> entry : imageCache.entrySet()) {  

068                 Bitmap bitmap = entry.getValue().get();  

069                 if (bitmap != null) {  

070                     bitmap.recycle();// 释放bitmap对象  

071                 }  

072             }  

073             imageCache.clear();  

074         }  

075     }  

076    

077     /**  

078      * 加载图片并显示的线程  

079      */ 

080     private class LoaderThread extends Thread {  

081    

082         LinkedHashMap<String, ImageView> mTaskMap;// 需要加载图片并显示的图片视图对象任务链  

083         private boolean mIsWait;// 标识是线程是否处于等待状态  

084    

085         public LoaderThread(ImageView imageView, String url) {  

086             mTaskMap = new LinkedHashMap<String, ImageView>();  

087             mTaskMap.put(url, imageView);  

088         }  

089    

090         /**  

091          * 处理某个视图的更新显示  

092          *   

093          * @param imageView  

094          */ 

095         public void load(ImageView imageView, String url) {  

096             mTaskMap.remove(imageView);// 任务链中可能有,得先删除  

097             mTaskMap.put(url, imageView);// 将其添加到任务中  

098             if (mIsWait) {// 如果线程此时处于等待得唤醒线程去处理任务队列中待处理的任务  

099                 synchronized (this) {// 调用对象的notify()时必须同步  

100                     this.notify();  

101                 }  

102             }  

103         }  

104    

105         @Override 

106         public void run() {  

107             while (mTaskMap.size() > 0) {// 当队列中有数据时线程就要一直运行,一旦进入就要保证其不会跳出循环  

108                 mIsWait = false;  

109                 final String url  = mTaskMap.keySet().iterator().next();  

110                 final ImageView imageView = mTaskMap.remove(url);  

111                 if (imageView.getTag() == url) {// 判断视图有没有复用(一旦ImageView被复用,其tag值就会修改变)  

112                     final Bitmap bitmap = MyConnection.getBitmapByUrl(url);// 此方法应该是从网络或sd卡中加载  

113                     try {  

114                         Thread.sleep(1000);// 模拟网络加载数据时间  

115                     } catch (InterruptedException e1) {  

116                         e1.printStackTrace();  

117                     }  

118                     // 将加载的图片放入缓存map中  

119                     imageCache.put(url, new SoftReference<Bitmap>(bitmap));  

120                     if (url == imageView.getTag()) {// 再次判断视图有没有复用  

121                         handler.post(new Runnable() {// 通过消息机制在主线程中更新UI  

122                             @Override 

123                             public void run() {  

124                                 imageView.setImageBitmap(bitmap);  

125                             }  

126                         });  

127                     }  

128                 }  

129                 if (mTaskMap.isEmpty()) {// 当任务队列中没有待处理的任务时,线程进入等待状态  

130                     try {  

131                         mIsWait = true;// 标识线程的状态,必须在wait()方法之前  

132                         synchronized (this) {  

133                             this.wait();// 保用线程进入等待状态,直到有新的任务被加入时通知唤醒  

134                         }  

135                     } catch (InterruptedException e) {  

136                         e.printStackTrace();  

137                     }  

138                 }  

139             }  

140         }  

141     }  

142 } 
查看源码打印?01 private class ProductListAdapter extends BaseAdapter {  

02    

03         private AsynImageLoader mImageAsynLoader;  

04    

05         public ProductListAdapter() {  

06             mImageAsynLoader = new AsynImageLoader(mHandler);  

07         }  

08    

09         @Override 

10         public int getCount() {  

11             int size = Math.min(mLastItemViewIndex + 1, mDataList.size());  

12             mLastItemViewIndex = size - 1;  

13             return size;  

14         }  

15    

16         @Override 

17         public Object getItem(int position) {  

18             return mDataList.get(position);  

19         }  

20    

21         @Override 

22         public long getItemId(int position) {  

23             return position;  

24         }  

25    

26         @Override 

27         public View getView(int position, View convertView, ViewGroup parent) {  

28             if (convertView == null) {  

29                 convertView = getLayoutInflater().inflate(R.layout.product_list_item,  

30                         null);  

31             }  

32             ImageView imageView = (ImageView) convertView  

33                     .findViewById(R.id.iv_item_product_image);  

34             Map<String, String> map = mDataList.get(position);  

35 //存放图片所对应的url  

36             imageView.setTag(map.get("product_pic_address"));  

37             mImageAsynLoader.loadBitmap(imageView, mDefautBitmap);  

38             return convertView;  

39         }  

40     } 

 

分享到:
评论

相关推荐

    Android 图片异步加载 加载网络图片

    在Android应用开发中,图片加载是一项常见的任务,尤其是在处理大量图片或者网络图片时,为了提供良好的用户体验,我们通常会采用异步加载的方式。本篇将深入探讨Android平台上的图片异步加载策略,以及如何加载网络...

    Android异步加载图片例子

    在这个"Android异步加载图片例子"中,我们将探讨如何在Android应用中实现这一功能。 首先,我们需要理解Android的主线程(UI线程)与工作线程的区别。主线程负责处理用户界面交互,而工作线程则用于执行耗时操作,...

    Android图片异步加载-ListView、GridView、ViewPager

    总的来说,Android-Universal-Image-Loader为Android开发者提供了一种高效、灵活的图片异步加载解决方案,无论是ListView、GridView还是ViewPager,都可以通过其强大的功能提升用户体验。在实际开发中,掌握这个库的...

    使用Android Studio 练习RecyclerView 异步加载图片,解决图片乱序问题。

    4. **同步加载策略**:虽然异步加载是提高用户体验的关键,但在某些情况下,如列表项较少或者图片大小较小时,可以考虑同步加载,以避免乱序问题。 5. **监听加载状态**:通过监听图片加载库的事件回调,可以确保在...

    android Gridview 异步加载网络图片

    综上所述,"android Gridview 异步加载网络图片"是一个涉及Android UI设计、多线程编程、图片处理、缓存策略以及第三方库使用的综合主题。通过学习这个示例,开发者可以提升应用性能,提供更优质的用户体验。

    Android AsyncTask用法和异步加载图片.rar

    本资料包主要讲解了如何使用`AsyncTask`进行异步加载图片,这对于在UI线程中保持流畅用户体验至关重要。 `AsyncTask`是Android SDK中的一个类,它为开发者提供了简单的多线程和回调功能。它的核心思想是将长时间...

    android listView 异步加载图片

    这里的“android listView 异步加载图片”指的是在不阻塞UI线程的情况下,从网络、本地存储或其他来源加载图片到ListView中的技术。 这篇名为“ImageLoader”的Java文件很可能就是一个实现图片异步加载的工具类。在...

    android listView图片异步加载(拖动时不加载,双缓存)

    因此,我们需要采用异步加载图片的方式,同时为了优化性能,通常会采用双缓存策略。本文将详细介绍如何在ListView中实现图片的异步加载,并且在用户拖动时不加载,以提高滚动流畅性。 一、异步加载原理 异步加载是...

    Android Listview异步加载图片

    本文将深入探讨Android ListView中异步加载图片的策略、常见问题以及解决方案。 首先,我们要理解异步加载的基本原理。异步加载是指在后台线程中执行耗时操作,如加载图片,而主线程则继续处理用户交互,保证界面...

    Android 演示异步加载图片的实现 附源代码.rar

    Android 演示异步加载图片的实现 附源代码,这里主要是演示ListView的异步加载图片功能,异步加载一个view时,如果view里面有EditText,EditText在每次加载view都会触发焦点,这时候异步就会出错。可能我这样说不太...

    android TextView异步加载HTML(含图片)

    标题提到的“android TextView异步加载HTML(含图片)”就是一个解决此类问题的方法。 在描述中,我们看到一行代码 `tv.setText(Html.fromHtml(html1, new URLImageParser(tv), null));` 这是实现HTML加载的关键。...

    Android 图片异步加载

    在Android开发中,图片异步加载是一个至关重要的技术点,特别是在处理大量图片或者网络图片时。这不仅可以提高应用性能,防止UI线程阻塞,还能优化用户体验,避免因加载大图导致的应用卡顿。本话题将深入探讨Android...

    android图片异步加载

    在Android应用开发中,图片异步加载是一项至关重要的技术,特别是在处理大量图片或者网络图片时。这不仅可以提高用户体验,避免因加载图片导致的界面卡顿,还能有效节省系统资源,防止内存溢出(OOM)的发生。本文将...

    图片异步加载,照片墙,异步加载listview图片2

    在Android应用开发中,图片异步加载是一种常见的优化技术,特别是在构建类似照片墙或ListView这样的大量图片展示场景中。这个话题主要关注如何有效地处理图片资源,避免UI阻塞,提高用户体验。以下是对"图片异步加载...

    android 图片异步加载

    在Android应用开发中,图片异步加载是一种优化用户体验的关键技术,尤其在处理大量图片或高分辨率图片时。这种技术能够防止应用因为加载图片而变得卡顿或者无响应,提高应用的响应速度和流畅性。本篇文章将深入探讨...

    Android实现ListView异步加载图片

    "Android实现ListView异步加载图片" Android 实现 ListView 异步加载图片是一种常见的技术,旨在提高应用程序的性能和用户体验。本文将详细介绍 Android 中实现 ListView 异步加载图片的方法,并对相关的技术概念...

    Android ListView异步加载图片

    Android 异步加载图片,对ListView的异步加载图片的功能演示,主要根据url读取图片返回流的方法。为了方便演示,将请求图片的链接先固定,每读取好一个图片就更新,界面比较简单,当然你可以做成比较好的,像很多好...

    android异步加载图片

    "Android异步加载图片"是一个常见的需求,它涉及到用户体验优化、内存管理以及线程安全等多个方面。这里我们将深入探讨这个主题,并结合提供的"ImageLoader-develop"可能是一个图片加载库的源码,来讲解相关的知识点...

    Android studio中图片异步加载并缓存Android-Universal-Image-Loader

    这个库提供了丰富的功能,可以方便地在Android Studio项目中集成,使得图片的异步加载和缓存变得简单高效。 首先,我们要理解为什么需要图片异步加载。在Android设备上,如果直接在主线程中加载图片,尤其是大图或...

    Android图片异步加载大全

    以下将详细介绍Android异步加载图片的核心知识点及其重要性。 1. **异步加载原理** - 在Android中,UI线程负责处理用户交互和界面更新,因此不应在该线程执行耗时操作,如网络请求和图片解码。异步加载图片就是将...

Global site tag (gtag.js) - Google Analytics