zoukankan      html  css  js  c++  java
  • 图片缓存----三级缓存

    一、适配器类中图片设置

      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;
        }

    }

  • 相关阅读:
    堆栈学习
    需要阅读的书籍
    Rust Book Lang Ch.19 Fully Qualified Syntax, Supertraits, Newtype Pattern, type aliases, never type, dynamic sized type
    Rust Lang Book Ch.19 Placeholder type, Default generic type parameter, operator overloading
    Rust Lang Book Ch.19 Unsafe
    Rust Lang Book Ch.18 Patterns and Matching
    Rust Lang Book Ch.17 OOP
    Rust Lang Book Ch.16 Concurrency
    Rust Lang Book Ch.15 Smart Pointers
    HDU3966-Aragorn's Story-树链剖分-点权
  • 原文地址:https://www.cnblogs.com/BrightPoplar/p/4839993.html
Copyright © 2011-2022 走看看