Lru 算法(缓存淘汰算法)
LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。(PS:有兴趣可以用链表自己实现)
Android LruCache
在Android LruCache中的原理比较简单,有兴趣可以自己去了解.具体的代码这里就不放了.
1 LruCacheIMG 类
这里采用单例模式,主要原因是 在App中不是只有一处需要加载图片和缓存图片
private LruCacheIMG(){
Runtime t = Runtime.getRuntime();
// 这里用app 运行内存的 1/8 作为缓存图片的能缓存的最大容量
// 图片现在一般都比较大,但是也不能给过多的内存
int max = (int) (t.maxMemory()/8);
mLrc = new LruCache<String, Bitmap>(max){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
};
}
private static LruCacheIMG Init()
{
if (lruCacheImg == null)
{
synchronized (LruCacheIMG.class){
lruCacheImg = new LruCacheIMG();
}
}
return lruCacheImg;
}
// 这里采用单例模式,因为不是只有一个地方需要去加载图片
private static LruCacheIMG getInstance()
{
return lruCacheImg == null ? Init() : lruCacheImg;
}
2 主要功能display downloadIMG getBitMap
disPlay 接受到传过来的url 和 view 利用getBitMap 获取存在LrcCache中的Bitmap
如果存在 就加载 如果不存在呢? 那么就去下载
注意 子线程是不能更改UI的
public static void disPlay(ImageView view,String url)
{
Bitmap bitmap = getInstance().getBitMap(url);
if (bitmap == null)
{
getInstance().DownLoadImg(view,url);
}else {
view.setImageBitmap(bitmap);
}
}
private Bitmap getBitMap(String url)
{
return mLrc.get(url);
}
private void DownLoadImg(final ImageView view, final String url)
{
new Thread(new Runnable() {
@Override
public void run() {
URL imgURL = null;
try {
imgURL = new URL(url);
}catch (MalformedURLException e){
e.printStackTrace();
}
try {
HttpsURLConnection conn = (HttpsURLConnection) imgURL.openConnection();
conn.connect();
// 这里假设一定可以从网络获取到图片
InputStream is = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();
mLrc.put(url,bitmap);
Message msg = new Message();
Iview = view;
msg.obj = url;
handler.sendMessage(msg);
}catch (IOException e){
e.printStackTrace();
}
}
}).start();
}
3 主要代码如下
public class LruCacheIMG {
private static LruCache<String,Bitmap> mLrc;
private static LruCacheIMG lruCacheImg;
private ImageView Iview;
private android.os.Handler handler = new android.os.Handler(new android.os.Handler.Callback() {
@Override
public boolean handleMessage(Message message) {
String url = (String) message.obj;
if (Iview != null)
Iview.setImageBitmap(getBitMap(url));
return true;
}
});
private LruCacheIMG(){
Runtime t = Runtime.getRuntime();
int max = (int) (t.maxMemory()/8);
mLrc = new LruCache<String, Bitmap>(max){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
};
}
private static LruCacheIMG Init()
{
if (lruCacheImg == null)
{
synchronized (LruCacheIMG.class){
lruCacheImg = new LruCacheIMG();
}
}
return lruCacheImg;
}
private static LruCacheIMG getInstance()
{
return lruCacheImg == null ? Init() : lruCacheImg;
}
public static void disPlay(ImageView view,String url)
{
Bitmap bitmap = getInstance().getBitMap(url);
if (bitmap == null)
{
getInstance().DownLoadImg(view,url);
}else {
view.setImageBitmap(bitmap);
}
}
private Bitmap getBitMap(String url)
{
return mLrc.get(url);
}
private void DownLoadImg(final ImageView view, final String url)
{
new Thread(new Runnable() {
@Override
public void run() {
URL imgURL = null;
try {
imgURL = new URL(url);
}catch (MalformedURLException e){
e.printStackTrace();
}
try {
HttpsURLConnection conn = (HttpsURLConnection) imgURL.openConnection();
conn.connect();
// 这里假设一定可以从网络获取到图片
InputStream is = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();
mLrc.put(url,bitmap);
Message msg = new Message();
Iview = view;
msg.obj = url;
handler.sendMessage(msg);
}catch (IOException e){
e.printStackTrace();
}
}
}).start();
}
}
这只是自己做的一个简单的demo,如果其中有写的不好的地方,还望各位能够指出.