Android 实现单线程轮循机制批量下载图片
发布时间 - 2026-01-11 02:28:53 点击率:次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管理器实现下载图片功能
# 发送消息
# 网上
# 单线程
# 在这个
# 如有
# 才会
# 长时间
# 希望能
# 自定义
# 只有一个
# 每次都
# 谢谢大家
# 则可
# 并为
# 时才
# 可以下载
# 创建一个
# 中以
# 解决这个问题
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel安装步骤详细教程_Laravel环境搭建指南
bing浏览器学术搜索入口_bing学术文献检索地址
想要更高端的建设网站,这些原则一定要坚持!
如何撰写建站申请书?关键要点有哪些?
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
如何生成腾讯云建站专用兑换码?
如何快速搭建FTP站点实现文件共享?
Python函数文档自动校验_规范解析【教程】
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
历史网站制作软件,华为如何找回被删除的网站?
Laravel如何配置和使用缓存?(Redis代码示例)
Laravel如何使用Service Container和依赖注入?(代码示例)
大连网站制作公司哪家好一点,大连买房网站哪个好?
如何在橙子建站上传落地页?操作指南详解
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
bootstrap日历插件datetimepicker使用方法
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
中国移动官方网站首页入口 中国移动官网网页登录
高防服务器租用如何选择配置与防御等级?
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
实现点击下箭头变上箭头来回切换的两种方法【推荐】
QQ浏览器网页版登录入口 个人中心在线进入
如何快速生成专业多端适配建站电话?
太平洋网站制作公司,网络用语太平洋是什么意思?
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
网站图片在线制作软件,怎么在图片上做链接?
如何在七牛云存储上搭建网站并设置自定义域名?
php 三元运算符实例详细介绍
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Internet Explorer官网直接进入 IE浏览器在线体验版网址
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
如何快速搭建自助建站会员专属系统?
Laravel如何配置任务调度?(Cron Job示例)
node.js报错:Cannot find module 'ejs'的解决办法
,在苏州找工作,上哪个网站比较好?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
焦点电影公司作品,电影焦点结局是什么?
如何快速搭建高效WAP手机网站?
java获取注册ip实例
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
下一篇:《糖果空间》隐藏微信号方法
下一篇:《糖果空间》隐藏微信号方法

