@by moses
图片缓存 LurCache 值得注意的几点
使用到的对象:
一、定义一个帮助类A 包含{构造方法、一个LruCache<key,value>对象cache一个内部回调接口及其对象,主要方法}
【 例如: 通过封装的网络获取数据的类B从网络获取图片,并将其显示在listview 或 gridview上:
① 在自定义适配器中,通过帮助类B获得网络服务器返回的字符串 ,如URL 或者json等,
② 如果获得图片的url 则直接使用帮助类A获得图片并回调显示;
如果获得的是json ,则使用JSON.parseObject()等对象方法将其转换为响应对象,然后获取图片地址url,然后重复①。】
二、在构造方法中初始化上述LruCache<key,value>
三、通过主要方法传入的url地址获取图片
① 首先,根据传入的url到cache中找到对应的Bitmap对象theMap,
如果theMap != null,则直接返回theMap,这也就是外部调用该方法后,在此种情况下所获得的Bitmap对象;
如果theMap == null,则开启线程或异步任务从网络获取图片,并且返回空null,所得的Bitmap通过回调传递。
② 在上述过程中,当开启线程或异步任务从网络取图后,会通过handler将其传递到主线程,主线程中通过回调
接口将所得的Bitmap对象传递给调用它的对象。
【值得注意的是: 每一次开启线程取图后,也即该图片在cache中不存在,则需要在handler将其发送到主线程
之前将其以key:value形式添加到cache之中,这样,下次当判断对应url的Bitmap对象在cahce中已存在时,就不
会在重新从网络获取图片,也不会重复地向cache中添加相同的Bitmap对象。】
四、外部在适配器中使用这个帮助类A的对象,调用其主要方法并同时传递url参数和注册的借口对象,从而获得Bitmap对象
并将其设置给listview或gridview的数据源,提供给空间显示。
【注意:】 ① 帮助类A不应重复new, 也即它应该是全局变量,只需要在支配其的getView()重复调用方法即可;
② 在适配器getView()中获取并设置图片到控件时,应该先判断这个对象是否为null,
a.如果为空,则说明帮助类A对象返回的Bitmap对象在内存中已经存在,所以直接返回,不需要网络获取,
也自然不会通过注册的回调接口来传递。这时候,直接将它设置给控件显示即可。
b.在注册的接口的回调方法中,将接口传递过来的Bitmap对象设置给响应控件显示。
代码如下:
Bitmap bbMap = bitmapUtil.getBitmap(pirURL,new MyHttpBitmapUtil.HttpBitmapCallBackListener() {
@Override
public void onFinish(Bitmap bitmap) {
viewHolder.merchantImg.setImageBitmap(bitmap);
}
});
if(bbMap != null){
viewHolder.merchantImg.setImageBitmap(bbMap);
}