AndroID 实现单线程轮循机制批量下载图片
ListvIEw 在为item 添加从网上下载下来的图片时, 如果每次都整合一个item时都需要new一个Thread去下载图片,ListvIEw长时间滑动时会产生大量线程。
用单线程轮循机制则可以解决这个问题
步骤如下:
1、需要一个任务集合@H_403_13@
class imageVIEwTask{ String path; Bitmap bitmap; int position; }
// 任务集合 private List<imageVIEwTask> imagevIEws = new ArrayList<MusicAdapter.imageVIEwTask>();
2、在构造方法中创建一个线程,通过任务集合中的path去网上下载图片获得bitmap并放置在这个任务中以Message的obj形式传送给handler处理。@H_403_13@
只有在为ListvIEw设置适配器时才需要创建这个工作线程, 且只有一个
(while(true)循环 在activity 调用OnDestroy )才会终止@H_403_13@
// 获得图片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工具@H_403_13@
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中放入图片时的方便。@H_403_13@
// 给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 实现单线程轮循机制批量下载图片所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)