本文实例为大家分享了Android下载进度监听和通知的具体代码,供大家参考,具体内容如下
<强>下载管理器强>
关于下载进度的监听,这个比较简单,以apk文件下载为例,需要处理3个回调函数,分别是:
1。下载中
2.下载成功
3.下载失败
因此对应的回调接口就有了:
公共接口DownloadCallback {/* * *下载成功 * @param文件目标文件 */空白> 公开课ThreadManager { 私有静态ThreadPool mThreadPool;/* * *获取线程池 * * @return */公共静态ThreadPool getThreadPool () { 如果(null==mThreadPool) { 同步(ThreadManager.class) { 如果(null==mThreadPool) {//cpu个数 .availableProcessors int cpuNum=Runtime.getRuntime () ();//线程个数 int数=cpuNum * 2 + 1; mThreadPool=new ThreadPool(计数,计数,0); } } } 返回mThreadPool; } 公共静态类ThreadPool { int corePoolSize;//核心线程数 int maximumPoolSize;//最大线程数 长keepAliveTime;//保持活跃时间(休息时间) 私人ThreadPoolExecutor执行人;/* * *构造方法初始化 * * @param corePoolSize * @param maximumPoolSize * @param keepAliveTime */私人ThreadPool (int corePoolSize, int maximumPoolSize长keepAliveTime) { 这一点。corePoolSize=corePoolSize; 这一点。maximumPoolSize=maximumPoolSize; 这一点。keepAliveTime=keepAliveTime; } 私有静态最终ThreadFactory sThreadFactory ThreadFactory=new () { 私人最终AtomicInteger mCount=new AtomicInteger (1); 公共线程newThread (Runnable r) { 返回新线程(r,“ThreadManager # + mCount.getAndIncrement ()); } };/* * *执行线程任务 * * @param r */公共空间执行(可运行r) {//参1:核心线程数;参2:最大线程数;参3:保持活跃时间(休息时间);参4:活跃时间单位;参5:线程队列;参6:线程工厂;参7:异常处理策略 如果(null==执行人){ 遗嘱执行人=new ThreadPoolExecutor (corePoolSize maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, 新的LinkedBlockingQueue(), sThreadFactory/* Executors.defaultThreadFactory () */新的ThreadPoolExecutor.AbortPolicy ()); }//将当前运行的对象放在线程池中执行 executor.execute (r); }/* * *从线程池的任务队列中移除一个任务 *如果当前任务已经是运行状态了,那么就表示不在任务队列中了,也就移除失败。 */公共空间取消(Runnable r) { 如果(null !=执行人,,零!=r) { executor.getQueue () .remove (r); } }/* * *是否关闭了线程池 * @return */公共布尔isShutdown () { 返回executor.isShutdown (); }/* * *关闭线程池 */公共空间关闭(){ executor.shutdown (); } } } >之前 接下来就是一个下载管理器的封装了。
公开课DownloadManager { 私人DownloadCallback回调; 私人上下文语境; 私人字符串url; 私人字符串文件名;/* * * 初始化 * @param上下文上下文 * @param url目标文件url * @param文件名下载保存的文件名 * @param调下载回调函数 */公共DownloadManager(最后的上下文语境,最终字符串url,最终字符串文件名,DownloadCallback回调){ 这一点。上下文=上下文; 这一点。url=url; 这一点。文件名=文件名; 这一点。回调=回调; }/* * *开始下载 */公共空间startDownload () { 如果(null==回调)返回; ThreadManager.getThreadPool ()。执行(新Runnable () { @Override 公共空间run () { HttpURLConnection康涅狄格州=零; 尝试{ 康涅狄格州=(HttpURLConnection)新网址(URL) .openConnection (); conn.setRequestMethod(“获得”); conn.setReadTimeout (5000); conn.setConnectTimeout (10000); 长总=conn.getContentLength (); 长咕咕叫=0; 文件文件=新文件(PathUtils。getDirectory(上下文,“apk”),文件名); 如果(! file.exists ()) { file.createNewFile (); 其他}{ file.delete (); } FileOutputStream安全系数=new FileOutputStream(文件); 如果(200==conn.getResponseCode ()) { InputStream的=conn.getInputStream (); byte[]迷=新字节[1024]; int len=0; 而((len=in.read(浅黄色))!=1){ 安全系数。写(浅黄色,0,len); 咕咕叫+=兰; 回调。装货(总咕咕叫); } in.close (); fos.close (); 如果(咕咕叫==总){ callback.onComplete(文件); 其他}{ 抛出新的异常(“咕咕叫!=总”); } 其他}{ 抛出新的异常(" + conn.getResponseCode ()); } }捕捉(异常e) { e.printStackTrace (); callback.onError (e); 最后}{ 如果(零!=康涅狄格州){ conn.disconnect (); } } } }); } }安卓下载进度监听和通知的处理详解