`
张玉龙
  • 浏览: 735602 次
  • 性别: 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);
    }
}

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应用中实现这一功能的详细教程。下面将详细阐述相关知识点。 1. **图片缓存**: 图片缓存是为了提高应用性能,减少网络请求,...

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

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

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

    本文将详细介绍如何在ListView中实现图片的异步加载,并且在用户拖动时不加载,以提高滚动流畅性。 一、异步加载原理 异步加载是指在后台线程中执行耗时操作,例如网络请求或解码图片,避免阻塞主线程。Android提供...

    android 图片缓存处理,及异步加载类

    "Android 图片缓存处理,及异步加载类"这个主题主要涵盖了两个关键知识点:图片缓存和异步加载。 首先,让我们深入了解一下图片缓存。在Android应用中,频繁地加载网络图片会导致用户体验下降,因为这会消耗大量的...

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

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

    xamarin异步加载并缓存图片库

    在Xamarin开发中,异步加载和缓存图片是一项关键技术,它对于提高移动应用的性能和用户体验至关重要。异步加载允许应用在后台线程中处理图像数据,防止UI线程阻塞,确保用户界面始终保持流畅。而图片缓存则可以减少...

    android异步加载图片缓存释放

    在Android开发中,异步加载图片并进行缓存管理是一个重要的优化策略,它能有效提升用户体验,避免因为图片加载导致的界面卡顿。本话题主要围绕"android异步加载图片缓存释放"展开,我们将深入探讨如何实现这个功能...

    android应用开机动画,图片的异步加载

    在Android应用开发中,开机动画以及图片的异步加载是两个重要的技术点,它们直接影响到用户的使用体验。本文将详细讲解如何实现Android应用的开机动画以及如何优化图片的异步加载,使得ListView滚动流畅。 一、...

    Android中实现异步加载图片的Demo

    这个"Android中实现异步加载图片的Demo"展示了如何在Android应用中高效地加载和显示图片,无论是从本地存储还是网络URL获取。 首先,我们需要理解Android主线程与工作线程的概念。主线程负责用户界面的交互,而工作...

    Android Listview异步加载图片

    当图片从网络加载后,先保存在内存缓存,下次需要时直接从内存读取,若内存中没有再从磁盘加载。 - **尺寸适配**:根据ImageView的实际大小加载相应尺寸的图片,避免加载大图导致内存消耗过高。 - **占位符和错误...

    android异步加载图片

    5. **磁盘缓存**:除了内存缓存,图片库还会使用磁盘缓存,将图片保存到文件系统,下次加载时可直接从磁盘读取,减少网络请求。 6. **图片压缩与格式转换**:为了节省存储和带宽,可以考虑在加载前对图片进行压缩或...

    android Gridview 异步加载网络图片

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

    Android例子源码异步批量下载图片并缓存

    在Android开发中,异步批量下载图片并缓存是一个常见的需求,特别是在开发涉及大量图片展示的应用时,如社交应用、电商应用等。本教程将基于提供的Android例子源码,深入探讨如何实现这一功能。 首先,我们需要理解...

    Android实现ListView异步加载图片

    本篇文章将深入探讨如何在Android中实现ListView异步加载图片,主要涉及以下几个关键知识点: 1. **AsyncTask**:Android提供了AsyncTask类,用于在后台线程执行耗时操作,并在UI线程更新结果。在图片加载场景中,...

    安卓图片加载缓存相关-Android-异步图片加载器.zip

    当图片需要加载时,先查找内存缓存,如果没有找到再查找磁盘缓存,如果磁盘缓存也没有,则从网络加载,并将图片存入两层缓存中,以便后续使用。 "imageloader"这个名字很可能是一个图片加载库的实现,常见的Android...

    Android开发之listview优化+图片异步加载缓存+避免图片显示闪烁

    综上所述,通过ListView的优化、图片的异步加载和缓存策略,以及避免图片闪烁的方法,可以显著提升Android应用的性能和用户体验。实际开发中,结合具体情况灵活运用这些技术,能有效地解决类似问题。

Global site tag (gtag.js) - Google Analytics