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

    }

  • 相关阅读:
    delphi操作xml学习笔记 之一 入门必读
    Delphi中实现ListView滚动条的换肤方案
    关于CreateParams的参数
    Delphi中编写OwnerDraw方式按钮的方法以及注意点
    ClientDataSet使用心得和技巧
    ADO多线程
    SQL的单个表的大小限制最大可以是多大?
    TClientDataSet使用要点
    鼠标拖动窗体
    Delphi托盘类 收集
  • 原文地址:https://www.cnblogs.com/BrightPoplar/p/4839993.html
Copyright © 2011-2022 走看看