文档章节

图片加载缓存类的具体实现

今日竹石
 今日竹石
发布于 2014/05/09 14:36
字数 903
阅读 160
收藏 8
点赞 0
评论 2

package com.lq.android.common.util;


import java.lang.ref.ReferenceQueue;

import java.lang.ref.WeakReference;

import java.util.HashMap;

import java.util.LinkedHashMap;


import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.drawable.BitmapDrawable;

import android.os.AsyncTask;

import android.view.View;


import com.lq.android.R;


/**

 * 图片加载缓存类

 * 

 * @作者: 刘倩</br>

 * @时间: 2014年4月23日 下午9:45:31</br>

 * @描述: 图片加载缓存</br>

 */

public class ImageLoader

{

/** 缓存 */

private LruCache<String, Bitmap> cache = new LruCache<String, Bitmap>(20);


/**

* 显示图片的方法

* @param url

*            图片的url

* @param activity

*            显示图片的activity

* @param imageView

*            显示图片的控件

*/

@SuppressWarnings("deprecation")

public void displayImage(String url, Activity activity, View imageView)

{

Bitmap bitmap = cache.get(url);

if (bitmap != null)

{

imageView.setBackgroundDrawable(new BitmapDrawable(bitmap));

} else

{

imageView.setBackgroundResource(R.drawable.bg_cover_default);

try

{

new MyAsyncTask(imageView, url).execute();

} catch (Exception e)

{

e.printStackTrace();

}

}

}


/**

* 定义异步类

* @作者: 刘倩</br>

* @时间: 2014年4月23日 下午10:24:48</br>

* @描述: 对图片的操作</br>

*/

class MyAsyncTask extends AsyncTask<String, Integer, Bitmap>

{

/** 显示图片的View */

private View imageView;

/** 图片的url */

private String url;


/**

* 有参构造器

* @param imageView

*            显示图片的view

* @param url

*            下载图片的url

*/

public MyAsyncTask(View imageView, String url)

{

this.imageView = imageView;

this.url = url;

}


@Override

protected Bitmap doInBackground(String... params)

{

// 定义文件名称

String fileName = url.substring(url.lastIndexOf("/") + 1,

url.length());

// 本地图片

String bookCoverPath = "";

if(Boolean.valueOf(Tools.getSingleBook())){

bookCoverPath = AppConstant.bookSingleCoverPath;

}else{

bookCoverPath = AppConstant.bookCoverPath;

}

Bitmap bitmap = Tools.createBitmapFromSdcardOrData(ToolsDataBase.getFilePath(bookCoverPath+fileName));

if(bitmap == null){

try

{

ToolsDataBase.downLoadFileToSdcard(url,  bookCoverPath, fileName);

} catch (Exception e)

{

e.printStackTrace();

}

}

return null;

}


}

}


/**

 * 缓存类

 * 

 * @作者: 刘倩</br>

 * @时间: 2014年4月23日 下午9:50:36</br>

 * @描述: 缓存功能的实现类</br>

 */

class LruCache<K, V>

{

/** 定义HashMap */

private final HashMap<K, V> mLruMap;

/** 定义weakMap */

private final HashMap<K, Entry<K, V>> mWeakMap = new HashMap<K, Entry<K, V>>();

/** 定义队列 */

private ReferenceQueue<V> mQueue = new ReferenceQueue<V>();


/**

* 定义有参构造器

* @param capacity

*            容量

*/

@SuppressWarnings("serial")

public LruCache(final int capacity)

{

mLruMap = new LinkedHashMap<K, V>(16, 0.75f, true)

{


@Override

protected boolean removeEldestEntry(Entry<K, V> eldest)

{

return size() > capacity;

}


};

}


/**

* 清除缓存的数据

*/

@SuppressWarnings("unchecked")

private void cleanUpWeakMap()

{

Entry<K, V> entry = (Entry<K, V>) mQueue.poll();

while (entry != null)

{

mWeakMap.remove(entry.mKey);

entry = (Entry<K, V>) mQueue.poll();

}

}


/**

* 定义V

* @param key

*            键

* @param value

*            值

* @return  返回自定义的V

*/

public synchronized V put(K key, V value)

{

cleanUpWeakMap();

mLruMap.put(key, value);

Entry<K, V> entry = mWeakMap.put(key, new Entry<K, V>(key, value,

mQueue));

return entry == null ? null : entry.get();

}


/**

* 得到key值

* @param key

*            键

* @return  返回键值

*/

public synchronized V get(K key)

{

cleanUpWeakMap();

V value = mLruMap.get(key);

if (value != null)

{

return value;

}

Entry<K, V> entry = mWeakMap.get(key);

return entry == null ? null : entry.get();

}


/**

* 清除数据

*/

public synchronized void clear()

{

mLruMap.clear();

mWeakMap.clear();

mQueue = new ReferenceQueue<V>();

}


/**

* 定义Entry类

* @作者: 刘倩</br>

* @时间: 2014年4月23日 下午10:03:55</br>

* @描述: Entry类主要定义一些参数</br>

*/

private static class Entry<K, V> extends WeakReference<V>

{

/** K实例 */

K mKey;


public Entry(K key, V value, ReferenceQueue<V> queue)

{

super(value, queue);

mKey = key;

}

}

}

Tools中的方法:

/**

* 图片的不等比缩放

*

* @param src

*            源图片

* @param destWidth

*            缩放的宽度

* @param destHeigth

*            缩放的高度

* @return

*/

public static Bitmap lessenBitmap(Bitmap src, int destWidth, int destHeigth) {

try {

if (src == null)

return null;


int w = src.getWidth();// 源文件的大小

int h = src.getHeight();

float scaleWidth = ((float) destWidth) / w;// 宽度缩小比例

float scaleHeight = ((float) destHeigth) / h;// 高度缩小比例

Matrix m = new Matrix();// 矩阵

m.postScale(scaleWidth, scaleHeight);// 设置矩阵比例

Bitmap resizedBitmap = Bitmap

.createBitmap(src, 0, 0, w, h, m, true);// 直接按照矩阵的比例把源文件画入进行

return resizedBitmap;

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

/**

* 从sdcard或data文件夹读取图片

*

* @param context

* @param imagePath

* @return

*/

public static Bitmap createBitmapFormSdcardOrData(String imagePath) {

if (null == imagePath) {

return null;

}

InputStream stream = null;

try {

File file = new File(imagePath);

if (!file.exists())

return null;

BitmapFactory.Options o = new BitmapFactory.Options();

o.inJustDecodeBounds = true;

BitmapFactory.decodeStream(new FileInputStream(imagePath), null, o);


final int REQUIRED_SIZE = 70;

int width_tmp = o.outWidth, height_tmp = o.outHeight;

int scale = 1;

while (true) {

if (width_tmp / 2 < REQUIRED_SIZE

|| height_tmp / 2 < REQUIRED_SIZE)

break;

width_tmp /= 2;

height_tmp /= 2;

scale++;

}


BitmapFactory.Options o2 = new BitmapFactory.Options();

o2.inSampleSize = scale;

Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(

imagePath), null, o2);

return getRoundedCornerBitmap(bitmap);

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (stream != null) {

stream.close();

}

} catch (Exception ex) {

ex.printStackTrace();

}

}

return null;

}

ToolsDataBase中的方法:

/**

* 得到当前的路径

*

* @param filePath

*            文件路径

* @return

*/

public static String getFilePath(String filePath) {

try {

if (new File(AppConstant.sdcardRootPath + filePath).exists()) {

return AppConstant.sdcardRootPath + filePath;

} else if (new File(AppConstant.dataRootPath + filePath).exists()) {

return AppConstant.dataRootPath + filePath;

}

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

具体调用可以如下:

imageLoader.displayImage(coverUrl, activity,coverImage);


© 著作权归作者所有

共有 人打赏支持
今日竹石
粉丝 41
博文 227
码字总数 181312
作品 0
朝阳
程序员
加载中

评论(2)

王爵nice
王爵nice
-_- 看不懂
尧尧尧
尧尧尧
感觉不错的样子
源码阅读系列:Picasso源码阅读

Android开发中,我们经常用到各种开源框架,很多优秀的框架不仅提供了功能丰富的功能接口,其高超的代码编写和组织水平也值得我们学习。通过学习这些框架的源码,有助于快速提高我们的编程质...

JackMeGo ⋅ 2017/03/06 ⋅ 0

SDWebImage源码解读(一)

SDWebImage是我们常用的图片缓存加载库,我们有必要对源码进行仔细阅读与学习,以便了解更多SD支持的功能与实现原理,并且在遇到问题时能及时的进行调试解决。我们再阅读之前先自己想想一下,...

智小融 ⋅ 06/04 ⋅ 0

Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影。 可是有的人并不知道如何去使用这库如何进行配置...

清华漏子 ⋅ 2014/07/16 ⋅ 0

AndroidUniversalImageLoader图片异步加载类库的使用

开发App过程中,免不了要进行网络请求操作进行数据交换,比如下载图片,如果自己写一个下载图片的类进行操作的话,要考虑太多太多内容,必须线程池,内存溢出,图片磁盘缓存操作,图片内存缓...

球球 ⋅ 2016/07/06 ⋅ 0

Volley学习笔记(二)

上一篇介绍了Volley.java、RequestQueue.java、Request.java三个类,其中RequestQueue.java里面讲道了两个队列,一个缓存队列一个网络请求队列。 CacheDispatcher.java 这个类用于处理调度走...

tomcater ⋅ 2016/05/25 ⋅ 0

Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影。 一、介绍 Android-Universal-Image-Loader是一个...

Thanks ⋅ 2014/04/13 ⋅ 0

要点提炼|开发艺术之Bitmap&Cache

本篇将总结有关图片加载、缓存策略以及优化列表卡顿的知识点: Bitmap的高效加载 缓存策略 LruCache(内存缓存) DiskLruCache(磁盘缓存) ImageLoader 1.Bitmap的高效加载 a.Bitmap(位图):指一...

minmin_1123 ⋅ 2017/12/30 ⋅ 0

IOS开发网络加载图片缓存策略之──ASIDownloadCache缓存策略

下面是具体步骤: 一、设置缓存策略 首先在SplitDemoAppDelegate委托代理中,实现如下代码: 在SplitDemoAppDelegate.h文件中,代码如下: 1 #import <UIKit/UIKit.h> 2 3 @class ASIDownlo...

木木情深 ⋅ 2014/02/27 ⋅ 0

Android开源框架源码鉴赏:Fresco

关于作者 郭孝星,程序员,吉他手,主要从事Android平台基础架构方面的工作,欢迎交流技术方面的问题,可以去我的Github提issue或者发邮件至guoxiaoxingse@163.com与我交流。 文章目录 一 图...

郭孝星 ⋅ 02/03 ⋅ 0

Android自定义控件(三)继承控件

继承控件是我们Android开发中最重要也是最常使用的控件,它不同于自绘控件和组合控件,它不需要我们自己去重新去实现一个控件。面向对象的一个重要特性就是继承,相信各位同学对继承的了解都...

Jack_1900 ⋅ 2014/07/13 ⋅ 3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

看东方明珠新媒体如何基于阿里视频云,构建完整的视频OTT平台SaaS服务

摘要: 东方明珠新媒体如何基于阿里云,搭建了面向第三方的视频SaaS服务?6月8日,上海云栖大会视频专场中,东方明珠新媒体股份有限公司云计算中心的副总周少毅带来了《东方明珠视频云》为题...

阿里云云栖社区 ⋅ 27分钟前 ⋅ 0

C#调用WebService实例和开发 VS2013

简单的理解就是:webservice就是放在服务器上的函数,所有人都可以调用,然后返回信息。 Web Service的主要目标是跨平台的可互操作性。为了实现这一目标,Web Service 完全基于XML(可扩展标...

布衣大侠 ⋅ 30分钟前 ⋅ 0

基于FlumeNG+Kafka+ElasticSearch+Kibana的日志系统

环境准备 1.服务器概览 hostname ip 操作系统 说明 安装内容 node1.fek 192.168.2.161 centos 7 node1节点 nginx,jdk1.8, flumeNG, elasticsearch slave1 node2.fek 192.168.2.162 centos ......

张shieppp ⋅ 31分钟前 ⋅ 0

问答网站已成过去,深度问答社区才是当下

曾几何时,各类问答网站数不胜数,从百度知道这类综合型问答网站到各种垂直细分的问答网站,都有不少,但到了移动互联网时代,很明显的一大趋势是,网站整体的流量都在下滑,随着移动智能设备...

ThinkSNS账号 ⋅ 33分钟前 ⋅ 0

Android平台架构(ART)

Android平台架构(ART) 本文目的:准确表述Android平台架构 本文转载自[Android官网] 本文定位:学习笔记 学习过程记录,加深理解。也希望能给学习的同学一些灵感 本文更新时间:2018.06.22(...

lichuangnk ⋅ 35分钟前 ⋅ 0

看东方明珠新媒体如何基于阿里视频云,构建完整的视频OTT平台SaaS服务

摘要: 东方明珠新媒体如何基于阿里云,搭建了面向第三方的视频SaaS服务?6月8日,上海云栖大会视频专场中,东方明珠新媒体股份有限公司云计算中心的副总周少毅带来了《东方明珠视频云》为题...

猫耳m ⋅ 37分钟前 ⋅ 0

Java 动态代理 原理解析

概要 AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标...

轨迹_ ⋅ 39分钟前 ⋅ 0

js 获取当前时间

var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份(4位,1970-????)myDate.getMonth(); //获取当前月份(0-11,0代表1月)myDate...

夜醒者 ⋅ 45分钟前 ⋅ 0

windows删除或修改本地Git保存的账号密码

在win10或者win7都是一样的步骤: (一)进入控制面板(二)选择用户账户(三)选择管理你的凭据(四)选择Windows凭据(五)选择git保存的用户信息(六)选择编辑或者进...

果树啊 ⋅ 45分钟前 ⋅ 0

8个基本的Docker容器管理命令

前言: 在这篇文章中,我们将带你学习 8 个基本的 Docker 容器命令,它们操控着 Docker 容器的基本活动,例如 运行run、 列举list、 停止stop、 查看历史纪录logs、 删除delete 等等。文末福...

java高级架构牛人 ⋅ 47分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部