Android 实现单线程轮循机制批量下载图片
Android实现单线程轮循机制批量下载图片
listview在为item添加从网上下载下来的图片时,如果每次都整合一个item时都需要new一个Thread去下载图片,listview长时间滑动时会产生大量线程。
用单线程轮循机制则可以解决这个问题
步骤如下:
1、需要一个任务集合
classimageViewTask{
Stringpath;
Bitmapbitmap;
intposition;
}
//任务集合 privateListimageviews=newArrayList ();
2、在构造方法中创建一个线程,通过任务集合中的path去网上下载图片获得bitmap并放置在这个任务中以Message的obj形式传送给handler处理。
只有在为listview设置适配器时才需要创建这个工作线程,且只有一个
(while(true)循环在activity 调用OnDestroy)才会终止
//获得图片bitmap
workThread=newThread(){
publicvoidrun(){
while(isLoop){
if(!imageviews.isEmpty()){
try{
Messagemsg=newMessage();
//获得图片的bitmap
msg.obj=GetImageviewBitmap();
msg.what=HANDLER_LOAD_IMAGEVIEW_SUCCESS;
//发消息给主线程
handler.sendMessage(msg);
}catch(IOExceptione){
e.printStackTrace();
}catch(Exceptione){
e.printStackTrace();
}
}else{
synchronized(workThread){
try{
//任务队列为空则等待
workThread.wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
//GetImageviewBitmap()方法
//获得图片的bitmap
privateimageViewTaskGetImageviewBitmap()throwsException,IOException{
imageViewTaskivt=imageviews.remove(0);
Stringuri=BasicUri.BasicHttpUri+ivt.path;
HttpEntityentity=newHttpUtils().SetHttp(uri,HttpUtils.GET_METHOD,null);
byte[]bytes=EntityUtils.toByteArray(entity);
Bitmapbitmap=BitmapUtils.loadBitmap(bytes,50,50);
//将网上下载的图片存入缓存集合中
map.put(ivt.path,newSoftReference(bitmap));
ivt.bitmap=bitmap;
returnivt;
}
};
workThread.start();
}
这个是httpUtils工具
publicclassHttpUtils{
publicfinalstaticintGET_METHOD=1;
publicfinalstaticintPOST_MEHTOD=2;
/**
*构造方法
*@paramuri路径
*@parammethod发送消息模式GET_METHOD用get方式传送消息POST_MEHTOD用post方式传送消息
*/
publicstaticHttpEntitySetHttp(Stringuri,intmethod,Listpairs)throwsException{
HttpClientclient=newDefaultHttpClient();
HttpResponseresp=null;
switch(GET_METHOD){
//用get方式发送消息
caseGET_METHOD:
HttpGetget=newHttpGet(uri);
resp=client.execute(get);
break;
//用post方式发送消息
casePOST_MEHTOD:
HttpPostpost=newHttpPost(uri);
HttpEntityentity=newUrlEncodedFormEntity(pairs,"utf-8");
post.setEntity(entity);
post.setHeader("Content-Type",
"application/x-www-form-urlencoded");
resp=client.execute(post);
break;
}
returnresp.getEntity();
}
}
3、在自定义adapter的setView方法中在任务中放置图片下载的path和position,并为item中的imageview设置标记,为了在listview的item中放入图片时的方便。
//给imageview设置标记
holder.iv.setTag(position);
//增加任务队列
imageViewTasktask=newimageViewTask();
task.path=musics.get(position).getAlbumpic();
task.position=position;
imageviews.add(task);
//通知工作线程可以下载图片了
synchronized(workThread){
workThread.notify();
}
4、传送消息给主线程,让hanler去更新UI
//handler
privateHandlerhandler=newHandler(){
publicvoidhandleMessage(android.os.Messagemsg){
switch(msg.what){
caseHANDLER_LOAD_IMAGEVIEW_SUCCESS:
//更新UI
imageViewTaskivt=(imageViewTask)msg.obj;
ImageViewiv=(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批量下载图片的讲解,如有疑问请留言或者到本站社区进行交流讨论,大家共同进步,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。