安卓下载进度监听和通知的处理详解

  

本文实例为大家分享了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 ();   }   }   }   });   }   }      

安卓下载进度监听和通知的处理详解