从零开始编写图片加载库(四)之图片缓存MemoryCache

来源:互联网 发布:xcode使用教程c语言 编辑:程序博客网 时间:2024/06/10 01:15

图片加载通过内存加载是最快的,然而手机的内存并不是取之不尽的,所以在开发过程中还需要注意就是内存的使用问题,本节将不涉及内存使用和优化问题,本节只介绍图片下载后从内存中加载。

第一步:编写MemoryCache类

package cn.sundroid.cache;import java.lang.ref.Reference;import java.lang.ref.WeakReference;import java.util.Collections;import java.util.HashMap;import java.util.Map;import android.graphics.Bitmap;public class WeakMemoryCache {    /**保存Bitmap的对象*/    private final Map<String, Reference<Bitmap>> softMap = Collections            .synchronizedMap(new HashMap<String, Reference<Bitmap>>());    /**     * 根据键获得Bitmap     * @param key 查询需要的键     * @return     */    public Bitmap get(String key) {        if (key == null) {            throw new NullPointerException("key == null");        }        Bitmap result = null;        Reference<Bitmap> reference = softMap.get(key);        if (reference != null) {            result = reference.get();        }        return result;    }    /**     *      * 保存Bitmap到内存     * @param key 键     * @param value 值     * @return     */    public boolean put(String key, Bitmap value) {        if (key == null || value == null) {            throw new NullPointerException("key == null || value == null");        }        softMap.put(key, new WeakReference<Bitmap>(value));        return false;    }    /**     * 根据key从内存中移除Bitmap对象     * @param key     * @return     */    public Bitmap remove(String key) {        Reference<Bitmap> bmpRef = softMap.remove(key);        return bmpRef == null ? null : bmpRef.get();    }    /**     * 清空操作     */    public void clear() {        softMap.clear();    }}

第二步:编写实现,下载图片后在handler里面接收更新UI通知,从cache里面取图片。

package cn.sundroid.loader;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import cn.sundroid.cache.WeakMemoryCache;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.util.Log;import android.widget.ImageView;public class MainActivity extends Activity {    private ImageView image;    private final String TAG = "ImageLoader";    private WeakMemoryCache cache = new WeakMemoryCache();    private final String IMAGE_CACHE_KEY = "image_cache_key";    private Handler handler = new Handler() {        public void handleMessage(android.os.Message msg) {            Bitmap bitmap = cache.get(IMAGE_CACHE_KEY);            Log.e(TAG, "get bitmap from memory cache");            image.setImageBitmap(bitmap);        };    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        image = (ImageView) findViewById(R.id.image);        new Thread(new Runnable() {            @Override            public void run() {                try {                    //网络连接                    HttpURLConnection connection = (HttpURLConnection) new URL(                            "http://pic5.nipic.com/20091228/2588536_142951087553_2.jpg")                            .openConnection();                    connection.setConnectTimeout(3 * 1000);                    connection.setReadTimeout(20 * 1000);                    //读取文件流                    InputStream is = connection.getInputStream();                    //通过BitmapFactory解码二进制字节流成Bitmap                    Bitmap bitmap = BitmapFactory.decodeStream(is);                    Log.e(TAG, "put bitmap into memory cache");                    cache.put(IMAGE_CACHE_KEY, bitmap);                    //发送一个消息给Handler用于更新消息                    handler.sendEmptyMessage(0x10);                } catch (MalformedURLException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }            }        }).start();    }}

效果图

源代码下载==>

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝2岁还说话晚怎么办 一岁宝宝不愿意学说话怎么办 2周岁宝宝不愿意学说话怎么办 三岁宝宝不爱说话应该怎么办 三岁宝宝不理人怎么办 两岁半宝宝不说话不连贯怎么办 宝宝三岁说话口齿不清怎么办 b超宝宝腿短怎么办 两岁宝宝学说话口吃怎么办 两岁宝宝说话少怎么办 三岁宝宝说话少怎么办 快4岁不会说话怎么办 宝宝2岁半不爱说话怎么办 两岁半宝宝注意力不集中怎么办 中国出生的外籍小孩怎么办签证 中国人入外籍后国内财产怎么办 中国人入外籍后国内资产怎么办 小孩去美国上小学怎么办 咳嗽震的胸口疼怎么办 高中孩子对手机着迷怎么办 小孩不肯读书沉迷游戏怎么办 小孩沉迷吃鸡游戏怎么办 高一数学成绩差怎么办 小孩子学数学用手指算怎么办 孩子d和b分不清怎么办 和家人走散后怎么办幼儿教案 小孩胃口不好不爱吃饭怎么办 幼儿园孩子学习记不住怎么办 幼儿园小孩数字记不住怎么办 大班教案走丢了怎么办 ppt加视频反了怎么办 拔罐之后背疼怎么办 拔完火罐后背疼怎么办 打印机红色的口堵了怎么办 打印机红色复印不出来怎么办 打印机加错颜色墨水怎么办 中班安全教案脚扭伤了怎么办 中班脚扭伤了怎么办教案 中班安全脚扭伤了怎么办 中班安全脚扭伤了怎么办反思 走丢了怎么办教案反思