listView加载显示图片(缓存)

我用的是异步加载图片的方式,并且使用了缓存的方式。

1、这是继承了AsyncTask<String, Void, Bitmap>的MyTask类,用异步加载图片

public class MyTask extends AsyncTask<String, Void, Bitmap> {

    private ImageView imageView;
    private LruCache<String, Bitmap> lruCache;

    /**
     * 构造方法,需要把ImageView控件和LruCache对象传进来
     *
     * @param imageView
     *            加载图片到此
     * @param lruCache
     *            缓存图片的对象
     */
    public MyTask(ImageView imageView, LruCache<String, Bitmap> lruCache) {
        super();
        this.imageView = imageView;
        this.lruCache = lruCache;
    }

    /**
     * 调用LruCache的put 方法将图片加入内存缓存中,要给这个图片一个key 方便下次从缓存中取出来
     *
     * @param key
     * @param bitmap
     */
    private void addBitmapToMemoryCache(String key, Bitmap bitmap) {
        if (getBitmapFromMemoryCache(key) == null) {
            lruCache.put(key, bitmap);
        }
    }

    /**
     * 调用Lrucache的get 方法从内存缓存中去图片
     *
     * @param key
     * @return
     */
    public Bitmap getBitmapFromMemoryCache(String key) {
        return lruCache.get(key);
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        // TODO Auto-generated method stub
        Bitmap bitmap = null;
        try {
            HttpURLConnection connection = (HttpURLConnection) new URL(
                    params[0]).openConnection();
            connection.setConnectTimeout(10000);
            connection.setRequestMethod("GET");
            connection.setDoInput(true);

            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream instr = connection.getInputStream();
                bitmap = BitmapFactory.decodeStream(instr);
                instr.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        addBitmapToMemoryCache(params[0], bitmap);
        return bitmap;
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        this.imageView.setImageBitmap(result);
    }

}

2、这是继承了BaseAdapter的MyAdapter类

public class MyAdapter extends BaseAdapter {

    private Context context;
    private LayoutInflater inflater;
    private List<String> picPath;

    private final int maxMemory = (int) Runtime.getRuntime().maxMemory(); // 获取当前应用程序所分配的最大内存
    private final int cacheSize = maxMemory / 5; // 只分5分之一来做缓存
    private LruCache<String, Bitmap> mlruCache = new LruCache<String, Bitmap>(
            cacheSize) {
        protected int sizeOf(String key, Bitmap bitmap) { // 复写sizeof()方法
            return bitmap.getRowBytes() * bitmap.getHeight() / 1024;// 这是按多少KB来算
        };
    };

    public MyAdapter(Context context, List<String> picPath) {
        super();
        this.context = context;
        this.picPath = picPath;
        inflater = LayoutInflater.from(context);
    }

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

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

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

    @Override
    public View getView(int arg0, View v, ViewGroup arg2) {
        ViewHolder holder = null;
        if (v == null) {
            holder = new ViewHolder();
            v = inflater.inflate(R.layout.item_xml, null);
            holder.showiamge = (ImageView) v.findViewById(R.id.showiamge);
            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }

        if (v != null) {
            loadBitmap(picPath.get(arg0), holder.showiamge);
        }

        return v;
    }

    /**
     * @param urlStr
     *            所需要加载的图片的url。以String形式传进来,可以把这个作为缓存图片的key
     * @param image
     *            ImageView 控件
     */
    private void loadBitmap(String urlStr, ImageView image) {
        MyTask myTask = new MyTask(image, mlruCache); // 声明一个异步图片加载对象
        Bitmap bitmap = myTask.getBitmapFromMemoryCache(urlStr); // 首先从内存缓存中获取图片
        if (bitmap != null) {
            image.setImageBitmap(bitmap);// 如果缓存中存在这张图片则直接设置给ImageView
        } else {
            image.setImageResource(R.drawable.ic_launcher);// 否则先设置成默认的图片
            myTask.execute(urlStr);// 然后执行异步任务AsycnTask 去网上加载图片
        }
    }

}

class ViewHolder {
    public ImageView showiamge;
}

3、MainActivity类

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        context = getApplicationContext();
        picPath=Utils.addUrl();
        listView = (ListView) findViewById(R.id.listView1);
        MyAdapter adapter = new MyAdapter(context,picPath);
        listView.setAdapter(adapter);
    }

4、图片地址的工具类Utils。此图片地址是我电脑上服务器的,运行时需要改成想显示图片的地址。

public class Utils {

    /**图片的下载地址
     * @return
     */
    public static List<String> addUrl() {
        List<String> urlList = new ArrayList<String>();
        urlList.add("http://192.168.4.101/u=323544003,3655607636&fm=21&gp=0.jpg");
        urlList.add("http://192.168.4.101/u=337829107,754021853&fm=21&gp=0.jpg");
        urlList.add("http://192.168.4.101/u=516070125,1299753376&fm=21&gp=0.jpg");
        urlList.add("http://192.168.4.101/u=805375513,1202624231&fm=21&gp=0.jpg");
        urlList.add("http://192.168.4.101/u=856554332,2565501919&fm=21&gp=0.jpg");
        urlList.add("http://192.168.4.101/u=1107822669,2961831310&fm=21&gp=0.jpg");
        urlList.add("http://192.168.4.101/u=1285718395,2833183433&fm=21&gp=0.jpg");
        urlList.add("http://192.168.4.101/u=1826201872,3302300664&fm=21&gp=0.jpg");
        urlList.add("http://192.168.4.101/u=3384623684,3529436072&fm=21&gp=0.jpg");
        urlList.add("http://192.168.4.101/u=3936768754,2397124933&fm=21&gp=0.jpg");
        urlList.add("http://192.168.4.101/u=4271458677,998187374&fm=21&gp=0.jpg");
        urlList.add("http://192.168.4.101/1.jpg");
        urlList.add("http://192.168.4.101/2.jpg");
        urlList.add("http://192.168.4.101/3.jpg");
        urlList.add("http://192.168.4.101/4.jpg");
        urlList.add("http://192.168.4.101/5.jpg");
        urlList.add("http://192.168.4.101/6.jpg");
        urlList.add("http://192.168.4.101/7.jpg");

        return urlList;
    }
}

本人菜鸟一枚,这是本人第一次网上分享本人的成果,上述代码整合了多位大神的结晶,感觉还不错,如果不对的地方请指示出来。谢谢!

时间: 2024-10-10 16:08:20

listView加载显示图片(缓存)的相关文章

listview加载显示图片

public class ImageAndTextListAdapter extends ArrayAdapter<ImageAndText> { private ListView listView; private AsyncImageLoader asyncImageLoader; public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts, ListView listVi

预加载显示图片的艺术

一般情况下网页中的图片都是随文档流依次加载的,什么时候用到则什么时候加载,但是有些时候这样的加载方式往往会影响用户体验,比如鼠标hover变换背景图片的时候,只有鼠标移入才会对变换的图片进行加载,这样就可能会出现片刻的加载空白现象:又比如图片显示后隐藏再显示网站内容等也是同样的道理. 为了在必要的时候增加用户体验,提高网页的交互逼格,这里不得不介绍下图片预加载的艺术啦. 那么什么是图片预加载呢? 道理很简单啦,虽然某些图片一时半会我用不到,但是为了避免使用时出现的措手不及的现象,我还是乖乖把它们

Android ListView 图片异步加载和图片内存缓存

开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用户省流量,一般把加载完的图片先缓存下来,下次加载的时候就不需要再联网去服务器端加载.图片缓存一般分为一级缓存(即内存缓存)和二级缓存(即磁盘缓存).这里只讲一级缓存. 内存缓存就是把加载完的图片先放在手机内存中,等下次加载的时候再从内存中取出来. 优点是速度快,缺点是不能长久保存,用户退出应用程序之

(BUG已修改,最优化)安卓ListView异步加载网络图片与缓存软引用图片,线程池,只加载当前屏之说明

原文:http://blog.csdn.net/java_jh/article/details/20068915 迟点出更新的.这个还有BUG.因为软引应不给力了.2.3之后 前几天的原文有一个线程管理与加载源过多,造成浪费流量的问题.下面对这进下改进的一些说明(红色为新加) 这两天一直在优化这个问题.google也很多种做法.但发现都是比较不全面. 比如: 一些只实现了异步加载,却没有线程池与软引用. 一些是用AsynTast的, 一些有了线程池但加载所有的图片,这样造成具大资源浪费 一些是用

ListView 加载图片错乱问题

ListView 图片错乱的根本问题是:ListView 布局复用导致的,也就是复用convertView导致的 解决: 1,用第三方的ImageLoader 2,自己处理最主要的就是给ImageView设置Tag,保证ImageView要加载的图片就是从网络上获取的图片 3,通过ListView Item 移除屏幕监听RecyclerListener方式 代码: 1 //设置默认图片 imgHolder.imgView.setImageResource(R.drawable.ic_launch

页面加载时让其显示笼罩层与加载等待图片

页面加载时让其显示笼罩层与加载等待图片(结局比较完美,过程很坎坷,所以一定总结整理下,备用): 用了ajax异步,是因为js内容不能即时的显示出来,因为js是单线程,要把队列中的任务执行完后才会执行刚才对js的处理 要用beforeSend,complete的时候必须要用ajax异步 beforeSend: function () {},//程序一开始便会执行该函数,使用该方法必须使用异步ajax complete: function () {},//complete在success或error

Android之ListView异步加载网络图片(优化缓存机制)【转】

网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4 4.对下载的图片进行按比例缩放,以减少内存的消耗 具体的代码里面说明.先放上内存缓存类的代码MemoryCache.java: public class MemoryCache { private static final String TAG = "MemoryCa

Android错误之ListView加载错位_ListView图片错位

又遇到ListView加载item时,多个item中的图片会错位的情况 现象如下图,同一个人的头像显示的乱七八糟 找了一张图,很好地说明了问题的原因 问题原因就在于convertView的重用,当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView, 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Item8 复用的是Item1时候创建的view, Item8

TextView加载html图片异步显示(Picasso)

项目中有这样一个需求: textview加载一段 html标签 其中包含 "<Img url= " 图片异步展示 而且 根据图片的比例 宽度满屏展示. 思路: 重写textview Html.fromHtml方法  以及 图片Picasso展示(后面会附带Picasso 的两个转换类) 感觉网上没有合适的或者用的是Gilde加载 其实无论是Gilde还是Picasso加载豆豆都能满足我们的需求. 需求描述完毕 上张帅图: 好吧 废话不多说了 直接上实现代码 RichText: p