异步批量加载图片



ListView中的异步批量加载图片业务

使用单线程轮循任务队列的机制完成该业务

Android中的图片优化:

Bitmap图片的压缩   (位图对象)

常见的图片格式:
JPG: 最常用的压缩格式。压缩比率较高,但是
     不支持透明色。
PNG: 支持透明色。
GIF: 支持动态图。


压缩图片的方法:
BitmapFactory.decodeStream(Options opts)













import java.io.File;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


import com.yunajian.V40.R;


import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import android.widget.ListView;


/**
 * 异步批量加载图片的工具类
 */
public class ImageLoader {
private HashMap<String, SoftReference<Bitmap>> cache = new HashMap<String, SoftReference<Bitmap>>();
private Context context;
private List<ImageLoadTask> tasks = new ArrayList<ImageLoadTask>();
private Thread workThread;
private boolean isLoop = true;
private ListView listView;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case HANDLER_IMAGE_LOAD_SUCCESS:
//给相应的ImageView设置Bitmap
ImageLoadTask task = (ImageLoadTask) msg.obj;
Bitmap bitmap = task.bitmap;
ImageView imageView = (ImageView) listView.findViewWithTag(task.path);
if(imageView != null){
if(bitmap!=null){
imageView.setImageBitmap(bitmap);
}else{
imageView.setImageResource(R.drawable.ic_launcher);
}
}
break;
}
}
};
public static final int HANDLER_IMAGE_LOAD_SUCCESS = 1;


public ImageLoader(Context context, ListView listView) {
this.listView = listView;
this.context = context;
//启动工作线程  轮循任务集合
workThread = new Thread(){
public void run() {
while(isLoop){
if(!tasks.isEmpty()){ //不是空集
ImageLoadTask task = tasks.remove(0);
String url = task.path;
//发送http请求   下载图片
Bitmap bitmap = loadBitmap(url);
task.bitmap = bitmap;
//更新界面  发消息给handler
Message msg = new Message();
msg.what = HANDLER_IMAGE_LOAD_SUCCESS;
msg.obj = task;
handler.sendMessage(msg);
}else{ //空集合   等待
try {
synchronized (workThread) {
workThread.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
};
workThread.start();
}

/**
* 通过url地址 发送http请求 获取图片
* @param url
* @return
*/
public Bitmap loadBitmap(String url){
try {
InputStream is = HttpUtils.getInputStream(url);
//解析Bitmap  执行压缩算法   获取合适尺寸的图片
Bitmap bitmap = BitmapUtiks.loadBitmap(is, 50, 50);
//把bitmap存入内存缓存
cache.put(url, new SoftReference<Bitmap>(bitmap));
//把bitmap存入文件中
String filename = url.substring(url.lastIndexOf("/")+1);
File file = new File(context.getCacheDir(), "images/"+filename);
BitmapUtiks.save(bitmap, file);
return bitmap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}



public void displayImage(String url, ImageView imageView){
//给ivPic设置图片
//先去内存缓存中查询  看有没有
SoftReference<Bitmap> ref=cache.get(url);
if(ref!=null){  //以前存过
Bitmap bitmap = ref.get();  
if(bitmap!=null) { //以前存的还没有被干掉
imageView.setImageBitmap(bitmap);
return;
}
}
//去文件缓存中读取
String filename = url.substring(url.lastIndexOf("/")+1);
File file = new File(context.getCacheDir(), "images/"+filename);
Bitmap bitmap = BitmapUtiks.loadBitmap(file);
if(bitmap!=null){
//一旦从文件中读取出来  先存入内存缓存
cache.put(url, new SoftReference<Bitmap>(bitmap));
imageView.setImageBitmap(bitmap);
return;
}
// new Thread(){}.start();  不能写   写了会卡
//向任务集合中添加一个图片下载任务
imageView.setTag(url);
ImageLoadTask task = new ImageLoadTask();
task.path = url;
tasks.add(task);
synchronized (workThread) {
//唤醒工作线程  起来干活
workThread.notify();
}
}

class ImageLoadTask {
String path;  //保存图片下载路径
Bitmap bitmap; //下载成功后的图片
}


public void stopThread() {
isLoop = false;
synchronized (workThread) {
workThread.notify();
}
}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值