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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。