博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图片加载缓存类的具体实现
阅读量:6070 次
发布时间:2019-06-20

本文共 5978 字,大约阅读时间需要 19 分钟。

hot3.png

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

*            值

*  返回自定义的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

*            键

*  返回键值

*/

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

转载于:https://my.oschina.net/u/1244156/blog/262677

你可能感兴趣的文章
Intellij IDEA SVN版本控制问题
查看>>
canvas 连线动画
查看>>
工欲善其事必先利其器 工具介绍
查看>>
MISP6: 细化迭代4:实现退货用例
查看>>
项目SOA化
查看>>
小烦躁
查看>>
韩都衣舍连个面试的机会也不给
查看>>
ubuntu下安装phpunit
查看>>
CCNA WAN ACL&NAT
查看>>
Android:menu
查看>>
傻瓜式操作Nagios
查看>>
除去文件中显示的^M符号
查看>>
关于rman备份保留策略“恢复窗口”的一点理解
查看>>
Java 编程的动态性, 第四部分: 用 Javassist 进行类转换
查看>>
JavaScript—数组reduce()方法详解及高级技巧(18)
查看>>
【ThinkPHP3.2.3】学习ThinkPHP笔记:搭建环境(1)
查看>>
MySQL数据库之多条件查询索引实现(项目中经常用到)
查看>>
layer表单元素 三级联动 省市县选择框动态渲染问题解决
查看>>
php Notice: Undefined index: lable in 异常
查看>>
find命令的练习
查看>>