文档章节

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

今日竹石
 今日竹石
发布于 2014/05/09 14:36
字数 903
阅读 162
收藏 8

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
0
SDWebImage源码解读(一)

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

智小融
06/04
0
0
Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

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

清华漏子
2014/07/16
0
0
AndroidUniversalImageLoader图片异步加载类库的使用

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

球球
2016/07/06
63
0
Volley学习笔记(二)

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

tomcater
2016/05/25
33
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

(三)Nginx配置·续

概述 前文写了关于Nginx环境配置,但是还没有完,接下来将会继续讲三个相关的配置 主要是以下三个 1.Nginx访问日志 2.Nginx日志切割 3.静态文件不记录日志和过期时间 Nginx访问日志 1.先看看...

杉下
今天
1
0
jquery创建类似于java的map

var map = {}; // Map map = new HashMap(); map[key] = value; // map.put(key, value); var value = map[key]; // Object value = map.get(key); var has = key in map; // boolean has = ......

SuperDabai
今天
0
0
java大数据转换16进制转10进制

public static void main(String[] args) {String hex = "0xdbf3accc683297cf0000";BigInteger amount = new BigInteger(hex.substring(2), 16);System.out.println(amount);......

任梁荣
昨天
2
0
OSChina 周六乱弹 —— 目测我们程序员丁克的几率不大

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @真Skr小机灵鬼儿:8.13分享Jocelyn Pook/Russian Red的单曲《Loving Strangers》 《Loving Strangers》- Jocelyn Pook/Russian Red 手机党少...

小小编辑
昨天
15
4
TypeScript基础入门 - 函数 - 剩余参数

转载 TypeScript基础入门 - 函数 - 剩余参数 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.2.1 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能...

durban
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部