android下载封装类Download,支持断点下载

2024-09-04 18:08

本文主要是介绍android下载封装类Download,支持断点下载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

各种回调, 支持断点下载

Java代码   收藏代码
  1. public class Download implements Serializable {  
  2.     private static final int START = 1;                 // 开始下载  
  3.     private static final int PUBLISH = 2;               // 更新进度  
  4.     private static final int PAUSE = 3;                 // 暂停下载  
  5.     private static final int CANCEL = 4;                // 取消下载  
  6.     private static final int ERROR = 5;                 // 下载错误  
  7.     private static final int SUCCESS = 6;               // 下载成功  
  8.     private static final int GOON = 7;                  // 继续下载  
  9.         
  10.     private static ExecutorService mThreadPool;         // 线程池  
  11.         
  12.     static {  
  13.         mThreadPool = Executors.newFixedThreadPool(5);  // 默认5个   
  14.     }  
  15.             
  16.     private int mDownloadId;                            // 下载id  
  17.     private String mFileName;                           // 本地保存文件名  
  18.     private String mUrl;                                // 下载地址  
  19.     private String mLocalPath;                          // 本地存放目录  
  20.     
  21.     private boolean isPause = false;                    // 是否暂停  
  22.     private boolean isCanceled = false;                 // 是否手动停止下载  
  23.         
  24.     private OnDownloadListener mListener;               // 监听器  
  25.         
  26.     /** 
  27.      * 配置下载线程池的大小 
  28.      * @param maxSize 同时下载的最大线程数 
  29.      */  
  30.     public static void configDownloadTheadPool(int maxSize) {  
  31.         mThreadPool = Executors.newFixedThreadPool(maxSize);  
  32.     }  
  33.         
  34.     /** 
  35.      * 添加下载任务 
  36.      * @param downloadId 下载任务的id 
  37.      * @param url        下载地址 
  38.      * @param localPath   本地存放地址 
  39.      */  
  40.     public Download(int downloadId, String url, String localPath) {  
  41.         if (!new File(localPath).exists()) {  
  42.             new File(localPath).mkdirs();  
  43.         }  
  44.             
  45.         Log.log("下载地址;" + url);  
  46.             
  47.         mDownloadId = downloadId;  
  48.         mUrl = url;  
  49.         String[] tempArray = url.split("/");  
  50.         mFileName = tempArray[tempArray.length-1];  
  51.         mLocalPath = localPath;  
  52.     }  
  53.         
  54.     /** 
  55.      * 设置监听器 
  56.      * @param listener 设置下载监听器 
  57.      * @return this 
  58.      */  
  59.     public Download setOnDownloadListener(OnDownloadListener listener) {  
  60.         mListener = listener;  
  61.         return this;  
  62.     }  
  63.         
  64.     /** 
  65.      * 获取文件名 
  66.      * @return 文件名 
  67.      */  
  68.     public String getFileName() {  
  69.         return mFileName;  
  70.     }  
  71.     
  72.     /** 
  73.      * 开始下载 
  74.      * params isGoon是否为继续下载 
  75.      */  
  76.     public void start(final boolean isGoon) {  
  77.         // 处理消息  
  78.         final Handler handler = new Handler() {  
  79.             @Override  
  80.             public void handleMessage(Message msg) {  
  81.                 switch (msg.what) {  
  82.                 case ERROR:  
  83.                     mListener.onError(mDownloadId);  
  84.                     break;  
  85.                 case CANCEL:  
  86.                     mListener.onCancel(mDownloadId);  
  87.                     break;  
  88.                 case PAUSE:  
  89.                     mListener.onPause(mDownloadId);  
  90.                     break;  
  91.                 case PUBLISH:  
  92.                     mListener.onPublish(mDownloadId, Long.parseLong(msg.obj.toString()));  
  93.                     break;  
  94.                 case SUCCESS:  
  95.                     mListener.onSuccess(mDownloadId);  
  96.                     break;  
  97.                 case START:  
  98.                     mListener.onStart(mDownloadId, Long.parseLong(msg.obj.toString()));  
  99.                     break;  
  100.                 case GOON:  
  101.                     mListener.onGoon(mDownloadId, Long.parseLong(msg.obj.toString()));  
  102.                     break;  
  103.                 }  
  104.             }  
  105.         };  
  106.             
  107.         // 真正开始下载  
  108.         mThreadPool.execute(new Runnable() {  
  109.             @Override  
  110.             public void run() {  
  111.                 download(isGoon,handler);  
  112.             }  
  113.         });  
  114.     }  
  115.         
  116.     /** 
  117.      * 下载方法 
  118.      * @param handler 消息处理器 
  119.      */  
  120.     private void download(boolean isGoon, Handler handler) {  
  121.         Message msg = null;  
  122.         Log.log("开始下载。。。");  
  123.         try {  
  124.             RandomAccessFile localFile = new RandomAccessFile(new File(  
  125.                     mLocalPath + File.separator + mFileName), "rwd");  
  126.     
  127.             DefaultHttpClient client = new DefaultHttpClient();  
  128.             client.setParams(getHttpParams());  
  129.             HttpGet get = new HttpGet(mUrl);  
  130.     
  131.             long localFileLength = getLocalFileLength();  
  132.             final long remoteFileLength = getRemoteFileLength();  
  133.             long downloadedLength = localFileLength;  
  134.                 
  135.             // 远程文件不存在  
  136.             if (remoteFileLength == -1l) {  
  137.                 Log.log("下载文件不存在...");  
  138.                 localFile.close();  
  139.                 handler.sendEmptyMessage(ERROR);  
  140.                 return;  
  141.             }  
  142.     
  143.             // 本地文件存在  
  144.             if (localFileLength > -1l && localFileLength < remoteFileLength) {  
  145.                 Log.log("本地文件存在...");  
  146.                 localFile.seek(localFileLength);  
  147.                 get.addHeader("Range""bytes=" + localFileLength + "-"  
  148.                         + remoteFileLength);  
  149.             }  
  150.                 
  151.             msg = Message.obtain();  
  152.                 
  153.             // 如果不是继续下载  
  154.             if(!isGoon) {  
  155.                 // 发送开始下载的消息并获取文件大小的消息  
  156.                 msg.what = START;  
  157.                 msg.obj = remoteFileLength;  
  158.             }else {  
  159.                 msg.what = GOON;  
  160.                 msg.obj = localFileLength;  
  161.             }  
  162.                 
  163.             handler.sendMessage(msg);  
  164.                 
  165.             HttpResponse response = client.execute(get);  
  166.             int httpCode = response.getStatusLine().getStatusCode();  
  167.             if (httpCode >= 200 && httpCode <= 300) {  
  168.                 InputStream in = response.getEntity().getContent();  
  169.                 byte[] bytes = new byte[1024];  
  170.                 int len = -1;  
  171.                 while (-1 != (len = in.read(bytes))) {  
  172.                     localFile.write(bytes, 0, len);  
  173.                     downloadedLength += len;  
  174. //                  Log.log((int)(downloadedLength/(float)remoteFileLength * 100));  
  175.                     if ((int)(downloadedLength/(float)remoteFileLength * 100) % 10 == 0) {  
  176.                         // 发送更新进度的消息  
  177.                         msg = Message.obtain();  
  178.                         msg.what = PUBLISH;  
  179.                         msg.obj = downloadedLength;  
  180.                         handler.sendMessage(msg);  
  181. //                      Log.log(mDownloadId + "已下载" + downloadedLength);  
  182.                     }  
  183.                         
  184.                     // 暂停下载, 退出方法  
  185.                     if (isPause) {  
  186.                         // 发送暂停的消息  
  187.                         handler.sendEmptyMessage(PAUSE);  
  188.                         Log.log("下载暂停...");  
  189.                         break;  
  190.                     }  
  191.                         
  192.                     // 取消下载, 删除文件并退出方法  
  193.                     if (isCanceled) {  
  194.                         Log.log("手动关闭下载。。");  
  195.                         localFile.close();  
  196.                         client.getConnectionManager().shutdown();  
  197.                         new File(mLocalPath + File.separator + mFileName)  
  198.                                 .delete();  
  199.                         // 发送取消下载的消息  
  200.                         handler.sendEmptyMessage(CANCEL);  
  201.                         return;  
  202.                     }  
  203.                 }  
  204.     
  205.                 localFile.close();  
  206.                 client.getConnectionManager().shutdown();  
  207.                 // 发送下载完毕的消息  
  208.                 if(!isPause) handler.sendEmptyMessage(SUCCESS);  
  209.             }  
  210.     
  211.         } catch (Exception e) {  
  212.             // 发送下载错误的消息  
  213.             handler.sendEmptyMessage(ERROR);  
  214.         }  
  215.     }  
  216.     
  217.     /** 
  218.      * 暂停/继续下载 
  219.      * param pause 是否暂停下载 
  220.      * 暂停 return true 
  221.      * 继续 return false 
  222.      */  
  223.     public synchronized boolean pause(boolean pause) {  
  224.         if(!pause) {  
  225.             Log.log("继续下载");  
  226.             isPause = false;  
  227.             start(true); // 开始下载  
  228.         }else {  
  229.             Log.log("暂停下载");  
  230.             isPause = true;  
  231.         }  
  232.         return isPause;  
  233.     }  
  234.     
  235.     /** 
  236.      * 关闭下载, 会删除文件 
  237.      */  
  238.     public synchronized void cancel() {  
  239.         isCanceled = true;  
  240.         if(isPause) {  
  241.             new File(mLocalPath + File.separator + mFileName)  
  242.             .delete();  
  243.         }  
  244.     }  
  245.     
  246.     /** 
  247.      * 获取本地文件大小 
  248.      * @return 本地文件的大小 or 不存在返回-1 
  249.      */  
  250.     public synchronized long getLocalFileLength() {  
  251.         long size = -1l;  
  252.         File localFile = new File(mLocalPath + File.separator + mFileName);  
  253.         if (localFile.exists()) {  
  254.             size = localFile.length();  
  255.         }  
  256.         Log.log("本地文件大小" + size);  
  257.         return size <= 0 ? -1l : size;  
  258.     }  
  259.     
  260.     /** 
  261.      * 获取远程文件打下 or 不存在返回-1 
  262.      * @return 
  263.      */  
  264.     public synchronized long getRemoteFileLength() {  
  265.         long size = -1l;  
  266.         try {  
  267.             DefaultHttpClient client = new DefaultHttpClient();  
  268.             client.setParams(getHttpParams());  
  269.             HttpGet get = new HttpGet(mUrl);  
  270.     
  271.             HttpResponse response = client.execute(get);  
  272.             int httpCode = response.getStatusLine().getStatusCode();  
  273.             if (httpCode >= 200 && httpCode <= 300) {  
  274.                 size = response.getEntity().getContentLength();  
  275.             }  
  276.     
  277.             client.getConnectionManager().shutdown();  
  278.         } catch (Exception e) {  
  279.             e.printStackTrace();  
  280.         }  
  281.     
  282.         Log.log("远程文件大小" + size);  
  283.         return size;  
  284.     }  
  285.     
  286.     /** 
  287.      * 设置http参数 不能设置soTimeout 
  288.      * @return HttpParams http参数 
  289.      */  
  290.     private static HttpParams getHttpParams() {  
  291.         HttpParams params = new BasicHttpParams();  
  292.     
  293.         HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);  
  294.         HttpProtocolParams.setUseExpectContinue(params, true);  
  295.         HttpProtocolParams  
  296.                 .setUserAgent(  
  297.                         params,  
  298.                         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2041.4 Safari/537.36");  
  299.         ConnManagerParams.setTimeout(params, 4000);  
  300.         HttpConnectionParams.setConnectionTimeout(params, 4000);  
  301.             
  302.         return params;  
  303.     }  
  304.         
  305.     /** 
  306.      * 关闭下载线程池 
  307.      */  
  308.     public static void closeDownloadThread() {  
  309.         if(null != mThreadPool) {  
  310.             mThreadPool.shutdownNow();  
  311.         }  
  312.     }  
  313.     
  314.     public interface OnDownloadListener {  
  315.         public void onStart(int downloadId, long fileSize);  // 回调开始下载  
  316.         public void onPublish(int downloadId, long size);    // 回调更新进度  
  317.         public void onSuccess(int downloadId);               // 回调下载成功  
  318.         public void onPause(int downloadId);                 // 回调暂停  
  319.         public void onError(int downloadId);                 // 回调下载出错  
  320.         public void onCancel(int downloadId);                // 回调取消下载  
  321.         public void onGoon(int downloadId, long localSize);  // 回调继续下载  
  322.     }  





调用,如下:
Java代码   收藏代码
  1. Download d = new Download(1"http://baidu.com/test.zip","/sdcard/download/");  
  2.             d.setOnDownloadListener(new Download.OnDownloadListener() {  
  3.                 @Override  
  4.                 public void onSuccess(int downloadId) {  
  5.                     System.out.println(downloadId + "下载成功");  
  6.                 }  
  7.         
  8.                 @Override  
  9.                 public void onStart(int downloadId, long fileSize) {  
  10.                     System.out.println(downloadId + "开始下载,文件大小:" + fileSize);  
  11.                 }  
  12.         
  13.                 @Override  
  14.                 public void onPublish(int downloadId, long size) {  
  15.                     System.out.println("更新文件" + downloadId + "大小:" + size);  
  16.                 }  
  17.         
  18.                 @Override  
  19.                 public void onPause(int downloadId) {  
  20.                     System.out.println("暂停下载" + downloadId);  
  21.                 }  
  22.         
  23.                 @Override  
  24.                 public void onGoon(int downloadId, long localSize) {  
  25.                     System.out.println("继续下载" + downloadId);  
  26.                 }  
  27.         
  28.                 @Override  
  29.                 public void onError(int downloadId) {  
  30.                     System.out.println("下载出错" + downloadId);  
  31.                 }  
  32.         
  33.                 @Override  
  34.                 public void onCancel(int downloadId) {  
  35.                     System.out.println("取消下载" + downloadId);  
  36.                 }  
  37.             });  
  38.         
  39.             d.start(false);  


原址
http://www.oschina.net/code/snippet_1021353_38517#57000

这篇关于android下载封装类Download,支持断点下载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136653

相关文章

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

2. 下载rknn-toolkit2项目

官网链接: https://github.com/airockchip/rknn-toolkit2 安装好git:[[1. Git的安装]] 下载项目: git clone https://github.com/airockchip/rknn-toolkit2.git 或者直接去github下载压缩文件,解压即可。

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。