图片缓存----三级缓存

一、适配器类中图片设置

  ImageCacheTask imageCache = new ImageCacheTas(context);

  final String imgCover = list.get(position).getCover();
        vh.img_movie_item_listview.setTag(imgCover);
        Bitmap bm = imageCache.loadImage(imgCover, new ImageCallche() {
            @Override
            public void onImageLoad(String imageUrl, Bitmap image) {
                ImageView imageView = (ImageView) parent
                        .findViewWithTag(imgCover);
                if (imageView != null && image != null) {
                    imageView.setImageBitmap(image);
                }
            }
        });
        if (bm != null) {
            vh.img_movie_item_listview.setImageBitmap(bm);
        } else {
            vh.img_movie_item_listview.setImageResource(R.drawable.ic_launcher);
        }

二、定义类 ImageCacheTask :

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.ref.SoftReference;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;

public class ImageCacheTask {

private HashMap<String, SoftReference<Bitmap>> imageCache;
    private Context context;

public ImageCacheTask(Context context) {
        this.context = context;
        this.imageCache = new HashMap<String, SoftReference<Bitmap>>();
    }

// 接口供回调
    public interface ImageCallche {
        void onImageLoad(String imageUrl, Bitmap image);
    }

// 调用此方法先到缓存中找照片的bitmap对象是否存在,存在直接用(return回去),不存在则启动线程到服务器取,然后放到缓存中供下次使用
    // callback对象是调用时创建的对象,传递过来,供若干时间后,到服务取得照片以后,还能够把此张照片对号入座到他所属的ImageView
    public Bitmap loadImage(final String imgUrl, final ImageCallche callback) {

// 从缓存中使用图片
        if (imageCache.containsKey(imgUrl)) {
            Bitmap img = imageCache.get(imgUrl).get();
            if (img != null) {
                return img;
            } else {
                imageCache.remove(imgUrl);
            }
        }

final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                case 1:
                    callback.onImageLoad(imgUrl, (Bitmap) msg.obj);
                    break;
                case 2:
                    Toast.makeText(context, "网络异常", 0).show();
                    break;
                }
            }
        };

// 从服务器加载图片并使用
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (isNetAvailable(context)) {
                    // 从服务器请求图片
                    Bitmap img = getImageFromUrl(imgUrl);
                    // 把图片放入缓存中
                    imageCache.put(imgUrl, new SoftReference<Bitmap>(img));
                    Message msg = handler.obtainMessage(1, img);
                    handler.sendMessage(msg);
                } else {
                    handler.sendEmptyMessage(2);
                }
            }
        }).start();
        return null;
    }

// 从服务器请求图片资源
    public Bitmap getImageFromUrl(String imgUrl) {
        URL url;
        HttpURLConnection conn = null;
        try {
            url = new URL(imgUrl);
            conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5 * 1000);
            conn.setReadTimeout(5 * 1000);
            if (conn.getResponseCode() == 200) {
                return BitmapFactory.decodeStream(conn.getInputStream());
            } else {
                Log.d("Bright", "服务器异常");
            }
        } catch (MalformedURLException e) {
            Log.e("Bright", "" + e.getMessage());
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            Log.e("Bright", "" + e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            Log.e("Bright", "" + e.getMessage());
            e.printStackTrace();
        } finally {
            if (conn != null) {
                conn.disconnect();
                conn = null;
            }
        }
        return null;
    }

// 判断网络是否通畅
    public boolean isNetAvailable(Context context) {
        ConnectivityManager connMgr = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo netInfo = connMgr.getActiveNetworkInfo();// 得到网络通信信息
        if (netInfo == null || !netInfo.isAvailable()) {// 判断网络是否畅通
            return false;
        }
        return true;
    }

// 判断网络是否通畅
    public boolean isNetworkAvailable(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

if (cm == null) {
        } else {
            NetworkInfo[] info = cm.getAllNetworkInfo();
            if (info != null) {
                for (int i = 0; i < info.length; i++) {
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

}

时间: 2024-10-13 01:02:46

图片缓存----三级缓存的相关文章

安卓网络请求图片到图片的三级缓存技术(内存缓存,本地缓存,网络缓存)

安卓网络请求图片,对于我们来说并不陌生,因为每个应用都有可能会用到这一技术.通常情况下,我们第一次都是从网络上请求图片资源,然后将 图片资源保存到内存和本地,下一次动态显示图片的时候就不需要再从网络上请求图片资源了,直接从本地或者内存中获取就可以了.这就涉及到图片 的三级缓存技术,分别是内存缓存,本地缓存,网络缓存. 缓存的流程图: 首先我们定义一个类叫ClassLoader: package com.jsako.showprodinfodemo; import java.io.FileOutp

Android开发中图片的三级缓存策略

一.简介 现在的Android应用程序中,不可避免的都会使用到图片,如果每次加载图片的时候都要从网络重新拉取,这样不但很耗费用户的流量,而且图片加载的也会很慢,用户体验很不好.所以一个应用的图片缓存策略是很重要的.通常情况下,Android应用程序中图片的缓存策略采用"内存-本地-网络"三级缓存策略,首先应用程序访问网络拉取图片,分别将加载的图片保存在本地SD卡中和内存中,当程序再一次需要加载图片的时候,先判断内存中是否有缓存,有则直接从内存中拉取,否则查看本地SD卡中是否有缓存,SD

Android中图片的三级缓存策略

一.简介 现在的Android应用程序中,不可避免的都会使用到图片,如果每次加载图片的时候都要从网络重新拉取,这样不但很耗费用户的流量,而且图片加载的也会很慢,用户体验很不好.所以一个应用的图片缓存策略是很重要的.通常情况下,Android应用程序中图片的缓存策略采用"内存-本地-网络"三级缓存策略,首先应用程序访问网络拉取图片,分别将加载的图片保存在本地SD卡中和内存中,当程序再一次需要加载图片的时候,先判断内存中是否有缓存,有则直接从内存中拉取,否则查看本地SD卡中是否有缓存,SD

Android开源框架ImageLoader:加载图片的三级缓存机制

前言:可从  https://github.com/nostra13/Android-Universal-Image-Loader 下载三级缓存机制的开源框架.下文简单介绍该框架中主要的常用方法,掌握这些方法,基本就可应对多数图片下载的需求. 注意:以下代码为示意代码片断,仔细读一下应能知道怎么用.蓝色表示为开源框架中的类. 1.初始化ImageLoader类对象: ImageLoader imageLoader = ImageLoader.getInstance(); imageLoader.

图片的三级缓存

三级缓存 1, 一级缓存 内存缓存 访问快,效率高,可能导致内存溢出 从上往下,级别越来越低 强引用,只有没有任何引用的时候才会被虚拟机回收 软引用,当内存不足时,虚拟机会自动回收软引用引用的对象 弱引用,当对象创建完成后,虚拟机会不停的检测内存,当检测到弱引用,检测到就回收 虚引用,虚拟机随时回收 在安卓3.0之后,这个不推荐 ,推荐使用lrucache 最近使用的原则 当内存不足时,回收不常使用或者最近没有使用的对象 2.二级缓存 ,本地缓存,缓存到安卓的文件里面去,访问稍快,节省流量 3.

简单地Android中图片的三级缓存机制

我们不能每次加载图片的时候都让用户从网络上下载,这样不仅浪费流量又会影响用户体验,所以Android中引入了图片的缓存这一操作机制. 原理: 首先根据图片的网络地址在网络上下载图片,将图片先缓存到内存缓存中,缓存到强引用中 也就是LruCache中.如果强引用中空间不足,就会将较早存储的图片对象驱逐到软引用(softReference)中存储,然后将图片缓存到文件(内部存储外部存储)中:读取图片的时候,先读取内存缓存,判断强引用中是否存在图片,如果强引用中存在,则直接读取,如果强引用中不存在,则

android中图片的三级缓存cache策略(内存/文件/网络)

实现图片缓存也不难,需要有相应的cache策略.这里我采用 内存-文件-网络 三层cache机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference),其实网络不算cache,这里姑且也把它划到缓存的层次结构中 1.简介 现在android应用中不可避免的要使用图片,有些图片是可以变化的,需要每次启动时从网络拉取,这种场景在有广告位的应用以及纯图片应用(比如百度美拍)中比较多. 现在有一个问题:假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wi

属性动画与图片三级缓存

属性动画 动画: UI渐变, 变量值的变化 ObjectAnimator : ofInt("backgroundColor",start,end); ValueAnimator: for(int i = start; i< end; i++) { a = i; } ValueAnimator animation=ValueAnimator.ofInt(start,end); animation.setDuration(DURATION); animation.addUpdateL

浅谈图片载入的三级缓存(一)

之前被人问及过.图片的三级缓存是什么啊,来给我讲讲,图片三级缓存,好高大尚的名字,听着挺厉害,应该是非常厉害的技术.当时不会啊,也就没什么了.没有说出来呗,前一阶端用到了BitmapUtils的图片缓存框架,索性就自己找些知识点来研究一些图片的三级缓存是什么吧.真所谓是知识你要是不知道,那就真的说不出所以然来.可是当你真正的去了解了.三级缓存也不是那么高端的技术. 好了,闲话不多说了.開始图片的三级缓存原理吧. 什么是图片的三级缓存 1.内存缓存 优先载入,速度最快 2.本地缓存 次优先载入 速