`
寻梦者
  • 浏览: 626045 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Android 从缓存中读取图片并异步加载的类

阅读更多

在新浪微博的微博列表中的图片,为了加速其显示也未了加快程序的响应,可以参考该图片异步加载类实现。

 

public class AsyncImageLoader {
    
//SoftReference是软引用,是为了更好的为了系统回收变量
    private HashMap<String, SoftReference<Drawable>> imageCache;
    
public AsyncImageLoader() {
        imageCache 
= new HashMap<String, SoftReference<Drawable>>();
    }
    
    
public Drawable loadDrawable(final String imageUrl,final ImageView imageView, final ImageCallback imageCallback){
        
if (imageCache.containsKey(imageUrl)) {
            
//从缓存中获取
            SoftReference<Drawable> softReference = imageCache.get(imageUrl);
            Drawable drawable 
= softReference.get();
            
if (drawable != null) {
                
return drawable;
            }
        }
        
final Handler handler = new Handler() {
            
public void handleMessage(Message message) {
                imageCallback.imageLoaded((Drawable) message.obj, imageView,imageUrl);
            }
        };
        
//建立新一个新的线程下载图片
        new Thread() {
            @Override
            
public void run() {
                Drawable drawable 
= loadImageFromUrl(imageUrl);
                imageCache.put(imageUrl, 
new SoftReference<Drawable>(drawable));
                Message message 
= handler.obtainMessage(0, drawable);
                handler.sendMessage(message);
            }
        }.start();
        
return null;
    }
    
    
public static Drawable loadImageFromUrl(String url){
        URL m;
        InputStream i 
= null;
        
try {
            m 
= new URL(url);
            i 
= (InputStream) m.getContent();
        } 
catch (MalformedURLException e1) {
            e1.printStackTrace();
        } 
catch (IOException e) {
            e.printStackTrace();
        }
        Drawable d 
= Drawable.createFromStream(i, "src");
        
return d;
    }
    
    
//回调接口
    public interface ImageCallback {
        
public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl);
    }
}

 

 在Adapter中使用的方法为:

public class WeiBoAdapater extends BaseAdapter{
        
private AsyncImageLoader asyncImageLoader;

        @Override
        
public int getCount() {
            
// TODO Auto-generated method stub
            return wbList.size();
        }

        @Override
        
public Object getItem(int position) {
            
// TODO Auto-generated method stub
            return wbList.get(position);
        }

        @Override
        
public long getItemId(int position) {
            
// TODO Auto-generated method stub
            return position;
        }

        @Override
        
public View getView(int position, View convertView, ViewGroup parent) {
            
// TODO Auto-generated method stub
            convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.weibo, null);
            WeiBoHolder wh 
= new WeiBoHolder();
            wh.wbicon 
= (ImageView) convertView.findViewById(R.id.wbicon);
            wh.wbtext 
= (TextView) convertView.findViewById(R.id.wbtext);
            wh.wbtime 
= (TextView) convertView.findViewById(R.id.wbtime);
            wh.wbuser 
= (TextView) convertView.findViewById(R.id.wbuser);
            wh.wbimage
=(ImageView) convertView.findViewById(R.id.wbimage);
            WeiBoInfo wb 
= wbList.get(position);
            
if(wb != null)
            {
                convertView.setTag(wb.getId());
                wh.wbuser.setText(wb.getUserName());
                wh.wbtime.setText(wb.getTime());
                wh.wbtext.setText(wb.getText(), TextView.BufferType.SPANNABLE);
                
                Drawable cachedImage = asyncImageLoader.loadDrawable(wb.getUserIcon(), wh.wbicon, new ImageCallback(){
                   
public void imageLoaded(Drawable imageDrawable,ImageView imageView,String imageUrl){
                       imageView.setImageDrawable(imageDrawable);
                   }
                });
                
if (cachedImage == null)
                {
                    wh.wbicon.setImageResource(R.drawable.usericon);
                }
else{
                    wh.wbicon.setImageDrawable(cachedImage);
                }                    
            }          
            
            
return convertView;
        }
        
    }

 

分享到:
评论

相关推荐

    Android实现从缓存中读取图片与异步加载功能类.zip

    Android实现从缓存中读取图片与异步加载功能类.zip

    Android实现从缓存中读取图片与异步加载功能类

    本文实例讲述了Android实现从缓存中读取图片与异步加载功能类。分享给大家供大家参考,具体如下: 在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以参考该图片异步加载类实现。 public ...

    安卓源码包android图片缓存&展示Android 异步加载图片等24个合集.zip

    安卓源码包android图片缓存&展示Android 异步加载图片等24个合集: ‘360全景查看demo.rar afinal框架实现图片的简单异步缓存加载.rar andengine中直接加载多张小图片合成一张大图片生成动画精灵.rar android gif...

    Android网络图片异步加载实例

    开发Android程序,一般情况下都会有两个操作,图片的异步加载与缓存,而图片的异步加载大都是从网络读取图片(还有生成本地图片缩略图等操作),为了减少网络操作,加快图片加载速度就需要对图片进行缓存,所以网上...

    异步加载网络图片

    加载图片时先查看缓存中时候存在该图片 如果存在则返回该图片 否则先加载载一个默认的占位图片 同时创建一个通过网络获取图片的任务并添加 任务完成后放松消息给主线程更新界面 使用方法: AsynImageLoader ...

    Android项目 Gallery实现异步加载网络图片 并只加载当前停止页面图.rar

    **Android项目:Gallery异步加载网络图片并仅加载当前页图片** 本项目为一款基于Android的Gallery应用,实现了异步加载网络图片的功能,同时具备仅加载当前停止页面图片的特性,有效节省用户流量和提高应用性能。 ...

    android异步加载图片并缓存到本地实现方法

    在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出。针对上面遇到的两个问题,...

    android异步加载图片实例

    android图片的异步加载,主要...加载图片时先查看缓存中时候存在该图片,如果存在则返回该图片,否则先加载载一个默认的占位图片,同时创建一个通过网络获取图片的任务并添加,任务完成后放松消息给主线程更新界面。

    [imooc demo]Android必学-异步加载课程代码整理

    异步加载适配器,异步或线程获取图片,图片的一级缓存,滑动时停止加载等优化. AndroidStudio项目

    Android中使用二级缓存、异步加载批量加载图片完整案例

    Android应用中经常涉及从网络中加载大量图片,为提升加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存就是通过先从内存中获取、再从文件中获取,最后才会访问网络。内存缓存(一级)本质...

    Android异步加载图片Demo

    加载图片时先查看缓存中时候存在该图片,如果存在则返回该图片,否则先加载载一个默认的占位图片,同时创建一个通过网络获取图片的任务并添加,任务完成后放松消息给主线程更新界面。并且处理的多个细节,包括使用...

    Android实现异步加载图片

    因为麦洛之前实现异步加载图片都是使用了AsynTask这个API,继续这个类,实现起来非常简单也很方便.在doInBackground()方法里实现下载逻辑.具体实现如下 实现逻辑是:先从内存中读取,如果内存中有这张图片,则直接使用;...

    Android实现图片异步加载并缓存到本地

    在android应用开发的时候,加载网络图片是一个非常重要的部分,很多图片不可能放在本地,所以就必须要从服务器或者网络读取图片。 软引用是一个现在非常流行的方法,用户体验比较好,不用每次都需要从网络下载图片,...

    Android实现图片缓存与异步加载

    ImageManager2这个类具有异步从网络下载图片,从sd读取本地图片,内存缓存,硬盘缓存,图片使用动画渐现等功能,已经将其应用在包含大量图片的应用中一年多,没有出现oom。 Android程序常常会内存溢出,网上也有很多...

    [imooc扩展]异步加载课程 - RecyclerView版本

    异步加载适配器,异步或线程获取图片,图片的一级缓存,滑动时停止加载等优化.包括连接网络,json数据解析都是用的基础的东西,没用框架。很适合学习。 imooc原版本是listview,这里适配成RecyclerView。 与之前上传...

    YnetImg.java,安卓网络异步获取图片,存放本地,加载到imageview不会OOM

    安卓网络异步获取图片,存放本地,加载到imageview不会OOM 使用方法如下: //高清4K String url="http://attach.bbs.miui.com/forum/201502/03/150905vpzrbnzksnkbkyhr.jpg"; YnetImg yset=new YnetImg...

    Android实现图片异步加载及本地缓存

    在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出。针对上面遇到的两个问题,...

    Android项目模仿易网新闻页面源码(异步加载).rar

    Android项目模仿易网新闻页面源码(异步加载) 本资源提供了一个高质量的Android项目源码,旨在帮助您轻松实现类似于易网的新闻页面效果。该项目采用异步加载技术,有效提高了页面加载速度和用户体验。同时,该项目...

Global site tag (gtag.js) - Google Analytics