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

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 批量下载图片的讲解,如有疑问请留言或者到本站社区进行交流讨论,大家共同进步,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-11-05 19:05:39

Android 实现单线程轮循机制批量下载图片的相关文章

Android多线程+单线程+断点续传+进度条显示下载功能

效果图 白话分析: 多线程:肯定是多个线程咯 断点:线程停止下载的位置 续传:线程从停止下载的位置上继续下载,直到完成任务为止. 核心分析: 断点: 当前线程已经下载的数据长度 续传: 向服务器请求上次线程停止下载位置的数据 con.setRequestProperty("Range", "bytes=" + start + "-" + end); 分配线程: int currentPartSize = fileSize / mThreadNum

通过PHP批量下载图片文件的方法

  近一直很忙,遇到一个手工活,需要下载一些远程的图片,一共一百多张,如果通过手工一张一张的保存,也太耗费时间了,于是上网google了一把,找到PHP批量下载图片文件的方法,原文是关于如何使用PHP批量下载CSS文件中的图片的文章.经过研究改写了一下就可以使用了,方便快捷多了. PHP批量下载图片文件代码: set_time_limit(0);//设置PHP超时时间 $imagesURLArray = array_unique($imagesURLArray ); foreach($image

猎豹浏览器如何批量下载图片

  1.打开猎豹浏览器点击左上角头像→猎豹应用市场(http://store.liebao.cn/) 2.搜索图片批量 3.点击"Fatkun图片批量下载"应用安装 4.打开所需要批量下载的图片页面 5.点击"Fatkun图片批量下载"图片进行图片批量查看(支持所有页面以及当前页面) 6.点击"保存图片"进行图片批量下载 7.弹出提示,需要关闭下载前询问每个文件的保存位置(点击猎豹浏览器点击左上角头像→设置→更多设置里关闭[下载前询问每个文件的保

js批量下载图片的问题

问题描述 js批量下载图片的问题 比如说,客户在客户端上传了几张图片 这几张图片对应一个单号.每个单号最少都会对应两张图片.我现在要实现的是在一个文本域里面输入多个单号点下下载就把对应单号的图片给下载下来.求实现思路. 解决方案 输入单号完成后可以把单号,变成一个链接或者button都可以.点击的事件根据id去请求下载需要的图片. 解决方案二: 批量下载凡客诚品的图片node批量下载图片js下载图片到本地 解决方案三: 一个单号变成一个链接?

python批量下载图片的三种方法_python

有三种方法,一是用微软提供的扩展库win32com来操作IE,二是用selenium的webdriver,三是用python自带的HTMLParser解析.win32com可以获得类似js里面的document对象,但貌似是只读的(文档都没找到).selenium则提供了Chrome,IE,FireFox等的支持,每种浏览器都有execute_script和find_element_by_xx方法,可以方便的执行js脚本(包括修改元素)和读取html里面的元素.不足是selenium只提供对py

PHP file_put_contents()实现批量下载图片文件和css中图片代码

 代码如下 复制代码 set_time_limit(0);//设置PHP超时时间 $imagesURLArray = array_unique($imagesURLArray );   foreach($imagesURLArray as $imagesURL) {     echo $imagesURL;     echo "<br/>";     file_put_contents(basename($imagesURL), file_get_contents($ima

请高手提供web中的批量下载图片代码

问题描述 我下载服务器上的N张图片,然后指定本地的路径,图片下载到指定的文件夹中了 解决方案 解决方案二:该回复于2010-06-02 08:35:52被版主删除解决方案三:遍历每张图片呗,然后再保存到本地上喽解决方案四:求具体做法期待中

java js-java servlet这是单个下载,怎么打包批量下载

问题描述 java servlet这是单个下载,怎么打包批量下载 package cn.szusst.aqms.action.common; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletE

猎豹浏览器怎么批量下载网页图片

  1.打开猎豹浏览器点击左上角头像→猎豹应用市场(http://store.liebao.cn/) 2.搜索图片批量 3.点击"Fatkun图片批量下载"应用安装 4.打开所需要批量下载的图片页面 5.点击"Fatkun图片批量下载"图片进行图片批量查看(支持所有页面以及当前页面) 6.点击"保存图片"进行图片批量下载 7.弹出提示,需要关闭下载前询问每个文件的保存位置(点击猎豹浏览器点击左上角头像→设置→更多设置里关闭[下载前询问每个文件的保