利用监听者模式实现后台多文件下载的监听
来源:互联网 发布:交英语的软件 编辑:程序博客网 时间:2024/04/28 22:20
项目聊天功能中,需要监听图片的下载进度。类型于QQ的聊天图片查看。 当退出查看界面时, 下载进程仍在后台运行,再次进入查看界面,如何监听到图片的下载进度呢。 如图
/** * 下载文件 * * @param url * @param outputStream 输出流 * @param onUpdateListener 下载进度监听 * @return */public boolean downLoadFile(String url, OutputStream outputStream, OnUpdateListener onUpdateListener) { if (StringUtils.isStrEmpty(url)) { return false; } if (onUpdateListener != null) { downloadObserver.put(url, onUpdateListener); } HttpGet get = new HttpGet(url); // Header headerRange = new BasicHeader("connection", "close"); // get.addHeader(headerRange); get.addHeader("connection", "close"); InputStream in = null; try { HttpResponse response = getDownloadClient(url).execute(get); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { HttpEntity he = response.getEntity(); if (onUpdateListener != null) { onUpdateListener.onTotal(he.getContentLength()); } in = he.getContent(); byte[] buffer = new byte[1024]; int len = 0; long total = 0; while ((len = in.read(buffer)) != -1) { outputStream.write(buffer, 0, len); if (onUpdateListener != null) { onUpdateListener.onProcess(total); } } return true; } } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) in.close(); } catch (IOException e) { e.printStackTrace(); } } return false;}
这是原来 的下载代码, 这里的监听只能在第一次进放查看页面时生效。那么如何在重新进入时仍然能监听到下载的进度呢。 这里借鉴到监听者模式的思想。使用一个集合来管理 监听者对象
private Map<String, OnUpdateListener> downloadObserver = new HashMap<String, OnUpdateListener>();
提供添加监听的方法, 一个url对应一public void addObserver(String url, OnUpdateListener onUpdateListener) {
if (onUpdateListener != null) {
downloadObserver.put(url, onUpdateListener);
onUpdateListener.onTotal(-1);
}
}的 Listener动态获取
/** * 下载文件 * * @param url * @param outputStream 输出流 * @param onUpdateListener 下载进度监听 * @return */public boolean downLoadFile(String url, OutputStream outputStream, OnUpdateListener onUpdateListener) { if (StringUtils.isStrEmpty(url)) { return false; } if (onUpdateListener != null) { downloadObserver.put(url, onUpdateListener); } HttpGet get = new HttpGet(url); // Header headerRange = new BasicHeader("connection", "close"); // get.addHeader(headerRange); get.addHeader("connection", "close"); InputStream in = null; try { HttpResponse response = getDownloadClient(url).execute(get); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { HttpEntity he = response.getEntity(); if (downloadObserver.get(url) != null) { downloadObserver.get(url).onTotal(he.getContentLength()); } in = he.getContent(); byte[] buffer = new byte[1024]; int len = 0; long total = 0; while ((len = in.read(buffer)) != -1) { outputStream.write(buffer, 0, len); if (downloadObserver.get(url) != null) { total += len; downloadObserver.get(url).onProcess(total); } } return true; } } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) in.close(); } catch (IOException e) { e.printStackTrace(); } } return false;}
这样,在任意地方都可以监听到子线程的下载进度。
0 0
- 利用监听者模式实现后台多文件下载的监听
- Android 多文件监听的实现
- 文件下载 监听网络
- android 实现开机后台监听
- asphttprequest 实现文件下载, 监听下载进度以及当前网络的状态(WXHL)
- 利用接口实现自定义监听事件以及观察者模式
- 监听者模式实现对象通信
- 监听者模式(listener)(c++实现)
- 监听者模式(listener)(c++实现)
- 监听者模式(listener)(c++实现)
- 监听手机的耳机按键实现你的后台播放
- 利用服务实现电话监听
- 利用服务实现电话监听
- 利用服务实现电话监听
- java文件监听的实现(1)
- 探讨Android实现后台(Service)按键监听的功能
- Android 监听app前台、后台状态切换的实现方案
- 利用ZooKeeper API模拟HDFS节点的监听模式
- 如何设计高效合理的MySQl查询语句
- select poll epoll
- Response.AddHeader使用实例
- 【解题报告】2015ACM/ICPC亚洲区沈阳站
- js内置对象详解
- 利用监听者模式实现后台多文件下载的监听
- Android应用程序如何获得系统签名权限02
- innodb与myisam
- 服务器SVN上面的东西检出到本地
- Smarty跳转到页面锚点上
- Windows 10下WLAN突然不能连接(按那个启用禁用蓝牙的按钮也没有用)的问题
- C# Static 使用
- fragmentPagerAdapter与fragmentStatePagerAdapter的区别
- Jsp基础1:基本语法和使用