android下载封装类

public class Download implements Serializable {
    private static final int START = 1;                 // 开始下载
    private static final int PUBLISH = 2;               // 更新进度
    private static final int PAUSE = 3;                 // 暂停下载
    private static final int CANCEL = 4;                // 取消下载
    private static final int ERROR = 5;                 // 下载错误
    private static final int SUCCESS = 6;               // 下载成功
    private static final int GOON = 7;                  // 继续下载
     
    private static ExecutorService mThreadPool;         // 线程池
     
    static {
        mThreadPool = Executors.newFixedThreadPool(5);  // 默认5个 
    }
         
    private int mDownloadId;                            // 下载id
    private String mFileName;                           // 本地保存文件名
    private String mUrl;                                // 下载地址
    private String mLocalPath;                          // 本地存放目录
 
    private boolean isPause = false;                    // 是否暂停
    private boolean isCanceled = false;                 // 是否手动停止下载
     
    private OnDownloadListener mListener;               // 监听器
     
    /**
     * 配置下载线程池的大小
     * @param maxSize 同时下载的最大线程数
     */
    public static void configDownloadTheadPool(int maxSize) {
        mThreadPool = Executors.newFixedThreadPool(maxSize);
    }
     
    /**
     * 添加下载任务
     * @param downloadId 下载任务的id
     * @param url        下载地址
     * @param localPath   本地存放地址
     */
    public Download(int downloadId, String url, String localPath) {
        if (!new File(localPath).exists()) {
            new File(localPath).mkdirs();
        }
         
        Log.log("下载地址;" + url);
         
        mDownloadId = downloadId;
        mUrl = url;
        String[] tempArray = url.split("/");
        mFileName = tempArray[tempArray.length-1];
        mLocalPath = localPath;
    }
     
    /**
     * 设置监听器
     * @param listener 设置下载监听器
     * @return this
     */
    public Download setOnDownloadListener(OnDownloadListener listener) {
        mListener = listener;
        return this;
    }
     
    /**
     * 获取文件名
     * @return 文件名
     */
    public String getFileName() {
        return mFileName;
    }
 
    /**
     * 开始下载
     * params isGoon是否为继续下载
     */
    public void start(final boolean isGoon) {
        // 处理消息
        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                case ERROR:
                    mListener.onError(mDownloadId);
                    break;
                case CANCEL:
                    mListener.onCancel(mDownloadId);
                    break;
                case PAUSE:
                    mListener.onPause(mDownloadId);
                    break;
                case PUBLISH:
                    mListener.onPublish(mDownloadId, Long.parseLong(msg.obj.toString()));
                    break;
                case SUCCESS:
                    mListener.onSuccess(mDownloadId);
                    break;
                case START:
                    mListener.onStart(mDownloadId, Long.parseLong(msg.obj.toString()));
                    break;
                case GOON:
                    mListener.onGoon(mDownloadId, Long.parseLong(msg.obj.toString()));
                    break;
                }
            }
        };
         
        // 真正开始下载
        mThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                download(isGoon,handler);
            }
        });
    }
     
    /**
     * 下载方法
     * @param handler 消息处理器
     */
    private void download(boolean isGoon, Handler handler) {
        Message msg = null;
        Log.log("开始下载。。。");
        try {
            RandomAccessFile localFile = new RandomAccessFile(new File(
                    mLocalPath + File.separator + mFileName), "rwd");
 
            DefaultHttpClient client = new DefaultHttpClient();
            client.setParams(getHttpParams());
            HttpGet get = new HttpGet(mUrl);
 
            long localFileLength = getLocalFileLength();
            final long remoteFileLength = getRemoteFileLength();
            long downloadedLength = localFileLength;
             
            // 远程文件不存在
            if (remoteFileLength == -1l) {
                Log.log("下载文件不存在...");
                localFile.close();
                handler.sendEmptyMessage(ERROR);
                return;
            }
 
            // 本地文件存在
            if (localFileLength > -1l && localFileLength < remoteFileLength) {
                Log.log("本地文件存在...");
                localFile.seek(localFileLength);
                get.addHeader("Range", "bytes=" + localFileLength + "-"
                        + remoteFileLength);
            }
             
            msg = Message.obtain();
             
            // 如果不是继续下载
            if(!isGoon) {
                // 发送开始下载的消息并获取文件大小的消息
                msg.what = START;
                msg.obj = remoteFileLength;
            }else {
                msg.what = GOON;
                msg.obj = localFileLength;
            }
             
            handler.sendMessage(msg);
             
            HttpResponse response = client.execute(get);
            int httpCode = response.getStatusLine().getStatusCode();
            if (httpCode >= 200 && httpCode <= 300) {
                InputStream in = response.getEntity().getContent();
                byte[] bytes = new byte[1024];
                int len = -1;
                while (-1 != (len = in.read(bytes))) {
                    localFile.write(bytes, 0, len);
                    downloadedLength += len;
//                  Log.log((int)(downloadedLength/(float)remoteFileLength * 100));
                    if ((int)(downloadedLength/(float)remoteFileLength * 100) % 10 == 0) {
                        // 发送更新进度的消息
                        msg = Message.obtain();
                        msg.what = PUBLISH;
                        msg.obj = downloadedLength;
                        handler.sendMessage(msg);
//                      Log.log(mDownloadId + "已下载" + downloadedLength);
                    }
                     
                    // 暂停下载, 退出方法
                    if (isPause) {
                        // 发送暂停的消息
                        handler.sendEmptyMessage(PAUSE);
                        Log.log("下载暂停...");
                        break;
                    }
                     
                    // 取消下载, 删除文件并退出方法
                    if (isCanceled) {
                        Log.log("手动关闭下载。。");
                        localFile.close();
                        client.getConnectionManager().shutdown();
                        new File(mLocalPath + File.separator + mFileName)
                                .delete();
                        // 发送取消下载的消息
                        handler.sendEmptyMessage(CANCEL);
                        return;
                    }
                }
 
                localFile.close();
                client.getConnectionManager().shutdown();
                // 发送下载完毕的消息
                if(!isPause) handler.sendEmptyMessage(SUCCESS);
            }
 
        } catch (Exception e) {
            // 发送下载错误的消息
            handler.sendEmptyMessage(ERROR);
        }
    }
 
    /**
     * 暂停/继续下载
     * param pause 是否暂停下载
     * 暂停 return true
     * 继续 return false
     */
    public synchronized boolean pause(boolean pause) {
        if(!pause) {
            Log.log("继续下载");
            isPause = false;
            start(true); // 开始下载
        }else {
            Log.log("暂停下载");
            isPause = true;
        }
        return isPause;
    }
 
    /**
     * 关闭下载, 会删除文件
     */
    public synchronized void cancel() {
        isCanceled = true;
        if(isPause) {
            new File(mLocalPath + File.separator + mFileName)
            .delete();
        }
    }
 
    /**
     * 获取本地文件大小
     * @return 本地文件的大小 or 不存在返回-1
     */
    public synchronized long getLocalFileLength() {
        long size = -1l;
        File localFile = new File(mLocalPath + File.separator + mFileName);
        if (localFile.exists()) {
            size = localFile.length();
        }
        Log.log("本地文件大小" + size);
        return size <= 0 ? -1l : size;
    }
 
    /**
     * 获取远程文件打下 or 不存在返回-1
     * @return
     */
    public synchronized long getRemoteFileLength() {
        long size = -1l;
        try {
            DefaultHttpClient client = new DefaultHttpClient();
            client.setParams(getHttpParams());
            HttpGet get = new HttpGet(mUrl);
 
            HttpResponse response = client.execute(get);
            int httpCode = response.getStatusLine().getStatusCode();
            if (httpCode >= 200 && httpCode <= 300) {
                size = response.getEntity().getContentLength();
            }
 
            client.getConnectionManager().shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        Log.log("远程文件大小" + size);
        return size;
    }
 
    /**
     * 设置http参数 不能设置soTimeout
     * @return HttpParams http参数
     */
    private static HttpParams getHttpParams() {
        HttpParams params = new BasicHttpParams();
 
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
        HttpProtocolParams.setUseExpectContinue(params, true);
        HttpProtocolParams
                .setUserAgent(
                        params,
                        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2041.4 Safari/537.36");
        ConnManagerParams.setTimeout(params, 4000);
        HttpConnectionParams.setConnectionTimeout(params, 4000);
         
        return params;
    }
     
    /**
     * 关闭下载线程池
     */
    public static void closeDownloadThread() {
        if(null != mThreadPool) {
            mThreadPool.shutdownNow();
        }
    }
 
    public interface OnDownloadListener {
        public void onStart(int downloadId, long fileSize);  // 回调开始下载
        public void onPublish(int downloadId, long size);    // 回调更新进度
        public void onSuccess(int downloadId);               // 回调下载成功
        public void onPause(int downloadId);                 // 回调暂停
        public void onError(int downloadId);                 // 回调下载出错
        public void onCancel(int downloadId);                // 回调取消下载
        public void onGoon(int downloadId, long localSize);  // 回调继续下载
    }
}

如何调用,如下:

            Download d = new Download(1, "http://baidu.com/test.zip","/sdcard/download/");
            d.setOnDownloadListener(new Download.OnDownloadListener() {
                @Override
                public void onSuccess(int downloadId) {
                    System.out.println(downloadId + "下载成功");
                }
     
                @Override
                public void onStart(int downloadId, long fileSize) {
                    System.out.println(downloadId + "开始下载,文件大小:" + fileSize);
                }
     
                @Override
                public void onPublish(int downloadId, long size) {
                    System.out.println("更新文件" + downloadId + "大小:" + size);
                }
     
                @Override
                public void onPause(int downloadId) {
                    System.out.println("暂停下载" + downloadId);
                }
     
                @Override
                public void onGoon(int downloadId, long localSize) {
                    System.out.println("继续下载" + downloadId);
                }
     
                @Override
                public void onError(int downloadId) {
                    System.out.println("下载出错" + downloadId);
                }
     
                @Override
                public void onCancel(int downloadId) {
                    System.out.println("取消下载" + downloadId);
                }
            });
     
            d.start(false);
时间: 2024-08-14 16:27:45

android下载封装类的相关文章

Android 下载APK 安装APK 打开APK

今天有了一个这样的需求 :下载一个apk文件,然后当你下载完成后,按钮的文字发生改变,变成点击安装,然后安装完成之后,变成打开. 这是下载apk的方法: /** * 后台在下面一个Apk 下载完成后返回下载好的文件 * * @param httpUrl * @return */ private File downFile(final String httpUrl) { new Thread(new Runnable() { @Override public void run() { try {

Android 下载模块分析(DownloadManager和DownloadProvider)

Android下载模块主要有2个部分组成:DownloadManager和DownloadProvider:其中DownloadManager提供接口供调用,具体的实现是 DownloadProvider,包括相关数据信息的保存及文件下载. DownloadManager是系统开放给第三方应用使用的类,包含两个静态内部类DownloadManager.Query和DownloadManager.Request. DownloadManager.Request用来请求一个下载 DownloadMa

android下载网络图片并缓存

异步下载网络图片,并提供是否缓存至内存或外部文件的功能 异步加载类AsyncImageLoader public void downloadImage(final String url, final ImageCallback callback); public void downloadImage(final String url, final boolean cache2Memory, final ImageCallback callback); public void setCache2F

android 下载SDK被墙问题

先看看如何加快更新速度,再说如何更新. 首先更新host文件,如图,打开目录 C:\Windows\System32\drivers\etc,在目录下有hosts文件 打开方式选用“记事本”打开 将一下的文字复制到hosts文件里面,保存,注意不修改原来的文件内容,只是附加这些内容 74.125.113.121 developer.android.com203.208.46.146 dl.google.com203.208.46.146 dl-ssl.google.com android 下载S

Android下载网络文本

具体的界面如下图所示 从浏览器上下载文本文件到手机中,具体的步骤如下: 1.新建一个工程名为GetTxtData的项目: 2.修改res/layout/fragment_main.xml文件,具体代码如下: 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3

Android 下载网络图片保存到本地

通过网络地址获取网络图片,点击下载将图片显示出来,然后点击图片将图片保存到本地. 首先需要在manifest上添加一些权限: [java] view plain copy <!-- 访问网络的权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 文件读取的权限 --> <uses-permission android:name="andro

今日头条视频下载器[android下载源码]

在家无聊,看到赵四大神 写的一个python脚本下载今日头条的工具,最后他还给出了移动端的样子,可惜没有源码,在他的虚心教导下,看完了他的文章,我决定自己撸一个,见笑了: CSDN图片最大值只能传2m,所以用了两张gif图,大家见笑了. 下面说一下具体的实现过程,这一点说实在,基本上是翻译了赵大神 的文章,没啥要说,但是还是记录一下吧. 具体的实现步骤大概可以用下的思路概括: 说得挺高上,其实实现起来还是蛮简单的. 1.分享代码如下,主要是activity的intent配置,这个一般人都知道,我

Android下载文件(1)

service下载文件,加入标签: <service android:name=".MyService"></service> 添加相关权限: <uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE&quo

Android下载管理DownloadManager功能扩展和bug修改

http://www.trinea.cn/android/android-downloadmanager-pro/ 本文主要介绍如何修改Android系统下载管理,以支持更多的功能及部分bug修改和如何编译生效.目前内容包括暂停下载.继续下载.通知设置NotiExtra和NotiClass.wifi切换到3g自动暂停.Bug修改. PS: 很多童鞋不是自己做rom,所以就算修改了系统源码编译出来的包在其他系统上也不通用这里推荐[email protected](并不是我的开源项目,我的项目为[e