圖片加載緩存類的具體實現

package com.lq.android.common.util;java


import java.lang.ref.ReferenceQueue;android

import java.lang.ref.WeakReference;緩存

import java.util.HashMap;app

import java.util.LinkedHashMap;less


import android.app.Activity;異步

import android.graphics.Bitmap;ide

import android.graphics.drawable.BitmapDrawable;post

import android.os.AsyncTask;this

import android.view.View;url


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

相關文章
相關標籤/搜索