Android 实现单线程轮循机制批量下载图片

listview 在为item 添加从网上下载下来的图片时, 如果每次都整合一个item时都需要new一个Thread去下载图片,listview长时间滑动时会产生大量线程。
用单线程轮循机制则可以解决这个问题
步骤如下:
1、需要一个任务集合
class imageViewTask{
String path;
Bitmap bitmap;
int position;
}
// 任务集合 private List<imageViewTask> imageviews = new ArrayList<MusicAdapter.imageViewTask>();
2、在构造方法中创建一个线程,通过任务集合中的path去网上下载图片获得bitmap并放置在这个任务中以Message的obj形式传送给handler处理。
只有在为listview设置适配器时才需要创建这个工作线程, 且只有一个
(while(true)循环 在activity 调用OnDestroy )才会终止
// 获得图片bitmap
workThread = new Thread(){
public void run() {
while(isLoop){
if(!imageviews.isEmpty()){
try {
Message msg = new Message();
// 获得图片的bitmap
msg.obj = GetImageviewBitmap();
msg.what = HANDLER_LOAD_IMAGEVIEW_SUCCESS;
// 发消息给主线程
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}else{
synchronized (workThread) {
try {
//任务队列为空则等待
workThread.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//GetImageviewBitmap()方法
// 获得图片的bitmap
private imageViewTask GetImageviewBitmap() throws Exception, IOException {
imageViewTask ivt = imageviews.remove(0);
String uri = BasicUri.BasicHttpUri+ivt.path;
HttpEntity entity = new HttpUtils().SetHttp(uri, HttpUtils.GET_METHOD, null);
byte[] bytes = EntityUtils.toByteArray(entity);
Bitmap bitmap = BitmapUtils.loadBitmap(bytes, 50, 50);
// 将网上下载的图片存入缓存集合中
map.put(ivt.path, new SoftReference<Bitmap>(bitmap));
ivt.bitmap = bitmap;
return ivt;
}
};
workThread.start();
}
这个是httpUtils工具
public class HttpUtils {
public final static int GET_METHOD = 1;
public final static int POST_MEHTOD = 2;
/**
* 构造方法
* @param uri 路径
* @param method 发送消息模式 GET_METHOD用get方式传送消息 POST_MEHTOD用post方式传送消息
*/
public static HttpEntity SetHttp(String uri, int method, List<NameValuePair> pairs) throws Exception{
HttpClient client=new DefaultHttpClient();
HttpResponse resp = null;
switch (GET_METHOD) {
// 用get方式发送消息
case GET_METHOD:
HttpGet get=new HttpGet(uri);
resp=client.execute(get);
break;
// 用post方式发送消息
case POST_MEHTOD:
HttpPost post=new HttpPost(uri);
HttpEntity entity=new UrlEncodedFormEntity( pairs, "utf-8");
post.setEntity(entity);
post.setHeader("Content-Type",
"application/x-www-form-urlencoded");
resp=client.execute(post);
break;
}
return resp.getEntity();
}
}
3、在自定义adapter 的setView方法中在任务中放置图片下载的path和position, 并为item中的imageview设置标记, 为了在listview的item中放入图片时的方便。
// 给imageview设置标记
holder.iv.setTag(position);
// 增加任务队列
imageViewTask task = new imageViewTask();
task.path = musics.get(position).getAlbumpic();
task.position = position;
imageviews.add(task);
// 通知工作线程可以下载图片了
synchronized (workThread) {
workThread.notify();
}
4、传送消息给主线程,让hanler去更新UI
// handler
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case HANDLER_LOAD_IMAGEVIEW_SUCCESS:
// 更新UI
imageViewTask ivt = (imageViewTask) msg.obj;
ImageView iv = (ImageView) listview.findViewWithTag(ivt.position);
if(iv != null){
if(ivt.bitmap != null)
iv.setImageBitmap(ivt.bitmap);
}else{
iv.setImageResource(R.drawable.ic_launcher);
}
break;
}
};
};
以上就是使用Android 批量下载图片的讲解,如有疑问请留言或者到本站社区进行交流讨论,大家共同进步,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# 单线程轮循机制批量下载图片
# 下载图片
# Android异步下载图片并且缓存图片到本地DEMO详解
# Android带进度条的下载图片示例(AsyncTask异步任务)
# Android编程实现下载图片及在手机中展示的方法
# Android使用AsyncTask下载图片并显示进度条功能
# Android实现多线程下载图片的方法
# Android使用okHttp(get方式)下载图片
# Android DownloadMananger管理器实现下载图片功能
# 发送消息
# 网上
# 单线程
# 在这个
# 如有
# 才会
# 长时间
# 希望能
# 自定义
# 只有一个
# 每次都
# 谢谢大家
# 则可
# 并为
# 时才
# 可以下载
# 创建一个
# 中以
# 解决这个问题
相关文章:
实现虚拟支付需哪些建站技术支撑?
如何用西部建站助手快速创建专业网站?
Thinkphp 中 distinct 的用法解析
如何在宝塔面板中修改默认建站目录?
如何在云主机上快速搭建网站?
武清网站制作公司,天津武清个人营业执照注销查询系统网站?
想学网站制作怎么学,建立一个网站要花费多少?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
非常酷的网站设计制作软件,酷培ai教育官方网站?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何用VPS主机快速搭建个人网站?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
如何在万网主机上快速搭建网站?
如何通过IIS搭建网站并配置访问权限?
如何选择最佳自助建站系统?快速指南解析优劣
如何选择PHP开源工具快速搭建网站?
在线教育网站制作平台,山西立德教育官网?
如何快速搭建高效可靠的建站解决方案?
香港服务器租用每月最低只需15元?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
建站之星如何保障用户数据免受黑客入侵?
如何快速打造个性化非模板自助建站?
网站制作壁纸教程视频,电脑壁纸网站?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
,制作一个手机app网站要多少钱?
宁波免费建站如何选择可靠模板与平台?
北京专业网站制作设计师招聘,北京白云观官方网站?
常州自助建站工具推荐:低成本搭建与模板选择技巧
建站之星多图banner生成与模板自定义指南
微信小程序制作网站有哪些,微信小程序需要做网站吗?
建站主机是否等同于虚拟主机?
湖北网站制作公司有哪些,湖北清能集团官网?
如何设计高效校园网站?
如何快速生成橙子建站落地页链接?
西安专业网站制作公司有哪些,陕西省建行官方网站?
图册素材网站设计制作软件,图册的导出方式有几种?
如何彻底删除建站之星生成的Banner?
如何用y主机助手快速搭建网站?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
如何在阿里云完成域名注册与建站?
建站VPS选购需注意哪些关键参数?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
如何用腾讯建站主机快速创建免费网站?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
jQuery 常见小例汇总
*请认真填写需求信息,我们会在24小时内与您取得联系。