参考视频,慕课网视频给出了使用AsyncTask缓冲图片的方法,将ImageLoader作为成员变量后,内存成功的作为一份,但getView屡次对传递过去的参数初始化,造成图片的判断条件失效,即下代码:
if(imageView.getTag().equals(url)){
//其他操作
}
修改后的加载图片的代码如下:
//导包等···
public class ImageLoader {
private LruCache<String,Bitmap> lruCache;
public ImageLoader() {
long maxMemory=Runtime.getRuntime().maxMemory();
long cacheSize=maxMemory/4;
lruCache=new LruCache<String, Bitmap>((int) cacheSize){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
};
}
public void addBitmapToCache(String url,Bitmap bitmap){
if(getBitmapFromCache(url)==null){
lruCache.put(url,bitmap);
}
}
public Bitmap getBitmapFromCache(String url){
return lruCache.get(url);
}
public void showImageByThread(final ImageView imageView, final String url){
Bitmap b = getBitmapFromCache(url);
final Handler handle=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(imageView.getTag().equals(url)) {
Bitmap bitmap= (Bitmap) msg.obj;
imageView.setImageBitmap(bitmap);
addBitmapToCache(url,bitmap);
}
}
};
if(b ==null){
new Thread(){
@Override
public void run() {
super.run();
Message message=Message.obtain();
message.obj=getBitmapFromURL(url);
handle.sendMessage(message);
}
}.start();
}else{
imageView.setImageBitmap(b);
}
}
Bitmap getBitmapFromURL(String url){
Bitmap bitmap=null;
try {
bitmap=BitmapFactory.decodeStream(new URL(url).openStream());
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
//第二种方法
public void showImageByAsyncTask(ImageView imageView,String url){
Bitmap b=getBitmapFromCache(url);
if(b==null){
new NewsAsyncTask(imageView,url).execute(url);
}else{
imageView.setImageBitmap(b);
}
}
class NewsAsyncTask extends AsyncTask<String,Void,Bitmap>{
private ImageView imageView;
private String url;
public NewsAsyncTask(ImageView imageView,String url) {
this.imageView = imageView;
this.url=url;
}
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmapFromURL = getBitmapFromURL(params[0]);
if(bitmapFromURL!=null)
addBitmapToCache(url,bitmapFromURL);
return bitmapFromURL;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
if(imageView.getTag().equals(url)){
imageView.setImageBitmap(bitmap);
}
}
}
}
效果如下:
需要源码的留言,不懂得我也可以帮你查!~0~