package com.yitian.activity.utils;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;
import android.util.LruCache;
import android.widget.ImageView;
import java.io.BufferedInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* Created by Huang hai-sen on 2015/12/10.
*/
public class ImageLoaders {
//创建Cache
private LruCache<String, Bitmap> mCaches;
public ImageLoaders() {
//获取最大可用内存
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory / 4;
mCaches = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
//每次存入缓存时使用
return bitmap.getByteCount();
}
};
}
/**
* 将Bitnap对象存入缓存中
*
* @param url //缓存图片的路径
* @param bitmap //缓存图片的对象
*/
public void addBitmapToCache(String url, Bitmap bitmap) {
if (getBitmapForCache(url) == null&&bitmap !=null) {
mCaches.put(url, bitmap);
}
}
/**
* 通过URL获取缓存图片,返回Bitmap对象或者返回null值
*
* @param url
* @return
*/
public Bitmap getBitmapForCache(String url) {
return mCaches.get(url);//底层linkHasMap
}
/**
* 通过url用get方法获取Bitmap对象图片
*
* @param url
* @return
*/
public Bitmap getBitmapForUrl(String url) {
try {
URL u = new URL(url);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
Bitmap bitmap = BitmapFactory.decodeStream(bis);
bis.close();
conn.disconnect();
return bitmap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 通过ImageView和url显示图片方法
*
* @param imageView
* @param url
*
* 调用方法:
* (1)在自定义的adapter中设置一个标记imageView.setTag(url)(注:在显示图片是先拿标记中的url和获取图片的url对比,一致时再显示图片)
* (2)调用new ImageLoader().showImageViewByAsyncTask(imageView,url);
*/
public void showImageViewByAsyncTask(ImageView imageView, String url) {
//先从缓存中获取图片
Bitmap bitmap = getBitmapForCache(url);
if (bitmap == null) {//不存在缓存中,直接开启异步任务下载
new MyAsnyTask(imageView, url).execute(url);
} else {//存在缓存中,直接显示
imageView.setImageBitmap(bitmap);
}
}
class MyAsnyTask extends AsyncTask<String, Void, Bitmap> {
private ImageView imageView;
private String url;
public MyAsnyTask(ImageView imageView, String url) {
this.imageView = imageView;
this.url = url;
}
@Override
protected Bitmap doInBackground(String... strings) {
String urlStr = strings[0];
Bitmap bitmap = getBitmapForUrl(urlStr);
//将不在缓存的图片加入缓存
addBitmapToCache(urlStr, bitmap);
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
//在向主线程提交时先检查Tag避免图片错位
if (imageView.getTag().equals(url))
imageView.setImageBitmap(bitmap);
}
}
/*
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (imageView.getTag().equals(url))
imageView.setImageBitmap((Bitmap) msg.obj);
}
};
public void showImageView(ImageView imageView, final String url) {
this.imageView = imageView;
this.url = url;
new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap = getBitmapForUrl(url);
Message message = Message.obtain();
message.obj = bitmap;
handler.sendMessage(message);
}
}).start();
}
*/
}