<强> Android实现单线程轮循机制批量下载图片强>
listview在为项目添加从网上下载下来的图片时,如果每次都整合一个项目时都需要新的一个线程去下载图片,listview长时间滑动时会产生大量线程。
用单线程轮循机制则可以解决这个问题
步骤如下:
<强> 1,需要一个任务集合强>
类imageViewTask { 字符串的道路; 位图的位图; int位置; } >之前//任务集合 私人Listimageview=new ArrayList ();>之前 <强> 2,在构造方法中创建一个线程,通过任务集合中去的道路网上下载图片获得位图并放置在这个任务中以消息的obj形式传送给处理程序处理。
强>只有在为listview设置适配器时才需要创建这个工作线程,且只有一个
(虽然(真正的)循环在activity 调用OnDestroy)才会终止
//获得图片位图 workThread=新线程(){ 公共空间run () { 而(isLoop) { 如果(! imageviews.isEmpty ()) { 尝试{ 消息味精=新消息();//获得图片的位图 味精。obj=GetImageviewBitmap (); 味精。什么=HANDLER_LOAD_IMAGEVIEW_SUCCESS;//发消息给主线程 handler.sendMessage(味精); }捕捉(IOException e) { e.printStackTrace (); }捕捉(异常e) { e.printStackTrace (); } 其他}{ 同步(workThread) { 尝试{//任务队列为空则等待 workThread.wait (); }捕捉(InterruptedException e) { e.printStackTrace (); } } } } >之前//GetImageviewBitmap()方法//获得图片的位图 私人imageViewTask GetImageviewBitmap()抛出异常,IOException { imageViewTask行=imageviews.remove (0); 字符串uri=BasicUri.BasicHttpUri + ivt.path; HttpEntity实体=new HttpUtils ()。HttpUtils SetHttp (uri。GET_METHOD, null); byte[]字节=EntityUtils.toByteArray(实体); 位图的位图=BitmapUtils。loadBitmap(字节,50,50);//将网上下载的图片存入缓存集合中 map.put诊断。路径,新的SoftReference(位图)); 早期诊断。位图=位图; 返回行; } }; workThread.start (); } >之前 这个是httpUtils工具
公开课HttpUtils { 最后公共静态int GET_METHOD=1; 最后公共静态int POST_MEHTOD=2;/* * *构造方法 * @param uri路径 * @param方法发送消息模式GET_METHOD用得到的方式传送消息POST_MEHTOD用发布方式传送消息 */公共静态HttpEntity SetHttp (String uri, int方法,List双)抛出异常{ HttpClient客户=new DefaultHttpClient (); HttpResponse resp=零; 开关(GET_METHOD) {//用得到的方式发送消息 案例GET_METHOD: HttpGet=new HttpGet (uri); resp=client.execute(得到); 打破;//用发布方式发送消息 案例POST_MEHTOD: HttpPost帖子=new HttpPost (uri); HttpEntity实体=new UrlEncodedFormEntity(对,“utf - 8”); post.setEntity(实体); post.setHeader(“内容类型”, “应用程序/x-www-form-urlencoded”); resp=client.execute (post); 打破; } 返回resp.getEntity (); } } >之前 <强> 3,在自定义适配器的setView方法中在任务中放置图片下载的路径和位置,并为项目中的imageview设置标记,为了在列表视图的项目中放入图片时的方便。强>
//给imageview设置标记 holder.iv.setTag(位置);//增加任务队列 imageViewTask任务=new imageViewTask (); 的任务。路径=musics.get(位置).getAlbumpic (); 的任务。位置=位置; imageviews.add(任务);//通知工作线程可以下载图片了 同步(workThread) { workThread.notify (); } >之前<强> 4,传送消息给主线程,让hanler去更新UI 强>
//处理程序 私人处理程序处理程序=new处理程序(){ 公共空间handleMessage (android.os。消息味精){ 开关(msg.what) { 案例HANDLER_LOAD_IMAGEVIEW_SUCCESS://更新UI imageViewTask溶=(imageViewTask) msg.obj; 第四ImageView=(ImageView) listview.findViewWithTag (ivt.position); 如果(iv !=null) { 如果诊断。位图!=null) iv.setImageBitmap (ivt.bitmap); 其他}{ iv.setImageResource (R.drawable.ic_launcher); } 打破; } }; };Android实现单线程轮循机制批量下载图片