学习分享:
一、LruCache+AsyncTask缓存和显示网络图片
1.生成LruCache对象
private final int size = (int)Runtime.getRuntime().maxMemory(); //获取手机RAM
private LruCache<String,Bitmap> lruCache = new LruCache<String,Bitmap>(size/7){
@Override
protected int sizeOf(String key, Bitmap value) {//重写此方法,返回给系统正确的size值(默认返回1)
return value.getByteCount();
}
};
2.LruCache常用方法:put(key,value)存入,get(key)取出对应的值
3.加入异步:
逻辑:先从LruCache(RAM缓存)获取,如果获取到的bitmap是空,则进行异步任务(去网络上解析图片得到对应bitmap,在onPostExecute()方法中将bitmap设置进ImageView)
加载图片工具类:
/** * Created by Administrator on 2016/9/12. * 图片工具类 */ public class ImgLoadUtil { private Bitmap bitmap; private final int size = (int)Runtime.getRuntime().maxMemory(); //获取手机RAM /** * 生成缓存对象 * 申请RAM空间最大是(手机RAM/7) */ private LruCache<String,Bitmap> lruCache = new LruCache<String,Bitmap>(size/7){ @Override protected int sizeOf(String key, Bitmap value) { return value.getByteCount(); } }; /** * 对外接口(adapter调用—在adapter中生成成员ImageLoadUtil对象,生成设置ImageView的图片时调用) * 获取网络地址对应的图片 * 1.从缓存中获取 * 2.获取失败则去网络中加载 * @param imgUrlString * @return */ public Bitmap getBitmapfromUrl(String imgUrlString,ImageView imageView){ bitmap = lruCache.get(imgUrlString); if(bitmap == null){ //从网络获取 LogTool.e("网络获取"); new ImgAsyncTask(imageView).execute(imgUrlString); }else{ LogTool.e("缓存获取"); } return bitmap;//这里还有问题回去修改 } /** * 将Bitmap添加到缓存 * @param imgUrl (key)图片对应的URL字符串(网址) * @param bitmap (value)要存入的值 */ private void addToLrucache(String imgUrl, Bitmap bitmap){ if(bitmap != null) lruCache.put(imgUrl,bitmap); } /** * 异步任务类(内部类) */ class ImgAsyncTask extends AsyncTask<String,Void,Bitmap>{ private String imgurl = ""; ImageView imageView; /** * 传进来的ImageView,后台任务完成后将获取到bitmap设置进ImageView * @param imageView */ public ImgAsyncTask(ImageView imageView) { this.imageView = imageView; } @Override protected Bitmap doInBackground(String... params) { imgurl = params[0]; return BitmapUtil.getBitmapFromURL(params[0]); } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); ImgLoadUtil.this.bitmap = bitmap; imageView.setImageBitmap(bitmap);//给ImageView设置图片 addToLrucache(imgurl,bitmap); } } }adapter——getView方法中调用
/** * 调用ImgLoadUtil的getBitmapfromUrl方法 * imgLoadUtil 是一个成员变量 */ Bitmap bitmap = imgLoadUtil.getBitmapfromUrl(list.get(position).getPicUrl(),myHolder.imageView); if(bitmap == null){ //获取到的bitmap是空则给予一个默认值 bitmap = FragFallow_beautifulGirl.bitmap; } myHolder.imageView.setImageBitmap(bitmap);获取网络地址对应的bitmap
/** * Created by Administrator on 2016/9/12. */ public class BitmapUtil { /** * 获取网络图片,转换成Bitmap * @param imgURL * @return */ public static Bitmap getBitmapFromURL(String imgURL){ Bitmap bitmap = null; try { URL url = new URL(imgURL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setReadTimeout(5000); connection.setDoInput(true); connection.connect(); bitmap = BitmapFactory.decodeStream(connection.getInputStream()); connection.disconnect(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return bitmap; } }