使用LRU缓存listview图片

public class ImageviewHolder {
         //设置全局变量
         private ImageView mImageView;
         private String mURL;
         private LruCache<String,Bitmap> mCache;

    public ImageviewHolder(){
        int MaxMem= (int) Runtime.getRuntime().maxMemory();
        int CacheMem=MaxMem/2;
        mCache=new LruCache<String,Bitmap>(CacheMem){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount();
            }
        };
    }
    private void addBitMapToCache(String url,Bitmap bitmap){
        if(getBitMapFromCache(url)==null){
            mCache.put(url,bitmap);
        }

    }
    private Bitmap getBitMapFromCache(String url){
        return mCache.get(url);

    }
    public void newthread(ImageView imageView, final String url) {
        mImageView = imageView;
        mURL = url;
        Bitmap bitmap=getBitMapFromCache(url);
        if (bitmap==null){
            new MyAsynctask(imageView,mURL).execute(mURL);
        }else {
            imageView.setImageBitmap(bitmap);
        }
        Log.i("i",mCache.size()+"");
        }
    public void showImageBy(ImageView imageView,String mURL)  {
        Bitmap bitmap= getBitMapFromCache(mURL);
        //判断在缓存中的图片是否存在,如果不存在则通过网络下载图片
        if (bitmap==null){
            new MyAsynctask(imageView,mURL).execute(mURL);
        }else {
            imageView.setImageBitmap(bitmap);
        }
    }
    public Bitmap getbitmapstream(String bitmapurl) throws IOException {
        InputStream is=null;
            //指向互联网资源的指针
            URL url=new URL(bitmapurl);
            //打开连接,并强行转换格式
            HttpURLConnection connection= (HttpURLConnection) url.openConnection();
            //获取输入的数据流
            is=new BufferedInputStream(connection.getInputStream());
            //解析所传入的数据
            Bitmap bitmap= BitmapFactory.decodeStream(is);
            //断开连接
            connection.disconnect();
            return bitmap;
    }
           private class MyAsynctask extends AsyncTask<String,Void,Bitmap>  {
               //通过AsyncTask通过网络下载图片,如果下载的图片不在缓存中则放入缓存中
               private ImageView mImageView;
               private String mURL;
               public MyAsynctask(ImageView imageview,String url){
                   mImageView=imageview;
                   mURL=url;
               }
            @Override
            protected Bitmap doInBackground(String... strings) {
                String url=strings[0];
                //从网络获取图片
                Bitmap bitmap = null;
                try {
                    bitmap = getbitmapstream(url);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                //将不在缓存的图片加入缓存
                if (bitmap!=null){
                    addBitMapToCache(url,bitmap);
                }
                return bitmap;
            }

            @Override
            protected void onPostExecute(Bitmap bitmap) {
                super.onPostExecute(bitmap);
                if (mImageView.getTag().equals(mURL)){
                    mImageView.setImageBitmap(bitmap);
                }
            }
        }
    }
//如果使用new ImageViewHolder方法创建则每次调用都会创建一个新的LRUCache,通过定义全局变量确保只有一个LRUCACHE创建
    public ImageviewHolder mImageViewHolder=new ImageviewHolder();;
时间: 2024-11-07 03:00:26

使用LRU缓存listview图片的相关文章

ListView的网络加载(使用LRU缓存,滚动监听器)

public class MainActivity extends AppCompatActivity { private List<Newsbeans> mlist; private static String url="http://www.imooc.com/api/teacher?type=4&num=30"; private ListView listView; @Override protected void onCreate(Bundle savedI

★android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import COM.Example.Main.R; import COM.Example.Main.stringG

Android性能优化之实现双缓存的图片异步加载工具(LruCache+SoftReference) - 拿来即用

之前在郭大神的博客看到使用LruCache算法实现图片缓存的.这里仿效他的思路,自己也写了一个. 并加入ConcurrentHashMap<String, SoftReference<Bitmap>>去实现二级缓存,因为ConcurrentHashMap是多个锁的线程安全,支持高并发.很适合这种频繁访问读取内存的操作. 下面整个思路是,使用了系统提供的LruCache类做一级缓存, 大小为运行内存的1/8,当LruCache容量要满的时候,会自动将系统移除的图片放到二级缓存中,但为

说说Android LRU缓存算法实现笔记(二)--LRU的应用

上一篇文章说说Android LRU缓存算法实现学习笔记(一) 中我们介绍了最常用的实现LRU缓存的数据结构LinkedHashMap,这一节我们会针对LinkedHashMap的数据结构的特性,来自己实现缓存结构和学习Android源码和项目中对缓存的完善. 上一篇说到对于缓存实现,我们很重要的会考虑以下几点:1.访问速度:2.逐出旧的缓存策略:3.最好还能考虑到一定的并发度.LinkedHashMap对哈希表的实现保证了我们缓存的快速访问速度,我们通过源码知道,LinkedHashMap默认

Android新浪微博client(七)——ListView图片异步加载、高速缓存

原文出自:方杰|p=193" style="color:rgb(202,0,0); text-decoration:none; font-size:14px; font-family:Georgia,'Times New Roman','Bitstream Charter',Times,serif; line-height:21px">http://fangjie.sinaapp.com/?p=193转载请注明出处 终于效果演示:page_id=54" hre

LRU缓存算法

引子: 我们平时总会有一个电话本记录所有朋友的电话,但是,如果有朋友经常联系,那些朋友的电话号码不用翻电话本我们也能记住,但是,如果长时间没有联系了,要再次联系那位朋友的时候,我们又不得不求助电话本,但是,通过电话本查找还是很费时间的.但是,我们大脑能够记住的东西是一定的,我们只能记住自己最熟悉的,而长时间不熟悉的自然就忘记了. 其实,计算机也用到了同样的一个概念,我们用缓存来存放以前读取的数据,而不是直接丢掉,这样,再次读取的时候,可以直接在缓存里面取,而不用再重新查找一遍,这样系统的反应能力

LRU缓存介绍与实现 (Java)

引子: 我们平时总会有一个电话本记录所有朋友的电话,但是,如果有朋友经常联系,那些朋友的电话号码不用翻电话本我们也能记住,但是,如果长时间没有联系 了,要再次联系那位朋友的时候,我们又不得不求助电话本,但是,通过电话本查找还是很费时间的.但是,我们大脑能够记住的东西是一定的,我们只能记住自己 最熟悉的,而长时间不熟悉的自然就忘记了. 其实,计算机也用到了同样的一个概念,我们用缓存来存放以前读取的数据,而不是直接丢掉,这样,再次读取的时候,可以直接在缓存里面取,而不用再重 新查找一遍,这样系统的反

8.16 lru缓存java版

lru详细介绍及简单代码实现: http://blog.csdn.net/beiyetengqing/article/details/7855933 以下是本人的加强的lru缓存类,增加单例获取.缓存超时机制和修复一个clear()的bug package com.george.xblog.utils; import java.util.Hashtable; import java.util.Map; /** * Created by george.yang on 15/8/15. */ pub

一个byte缓存--用于图片或视频

public class ImageCache { private List<byte[]> list = new ArrayList<byte[]>(); //存储所有部分缓存 private int initSize;    //初始化大小,每次申请时都会申请等同于initSize大小的byte[] buf private int size;    //image cache 的实际大小 public ImageCache(int initSize){ this.initSiz