android下载的断点续传的功能的实现

原创 2016年08月29日 15:02:13

前一篇博客介绍了android的多线程下载:
http://blog.csdn.net/whsdu929/article/details/52351807

下面来介绍一下下载过程中断点续传功能的实现。所谓的断点续传就是可以在下载过程中随时暂停下载,恢复下载时会从上次中断的地方继续下载,而不是从头开始。


断点续传的原理是:每次暂停下载时,记录保存每个线程当前下载到的位置,恢复下载时直接找到这个位置开始继续下载。


完整代码:

public class MainActivity extends ActionBarActivity {

    public static final String TEST_URL = "http://gdown.baidu.com/data/wisegame/e59f42264a98b05e/WeChat_861.apk";

    private Button btn;

    private boolean mIsDownloading = false;

    private List<HashMap<String, Integer>> mDownloadInfoList;

    private URL url;

    private File file;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDownloadInfoList = new ArrayList<>();

        btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mIsDownloading){
                    mIsDownloading = false;
                    btn.setText("开始下载");
                    return;
                }
                mIsDownloading = true;
                btn.setText("暂停下载");
                if(mDownloadInfoList.size() == 0){
                    new Thread() {
                        @Override
                        public void run() {
                            try {
                                url = new URL(TEST_URL);
                                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                                conn.setRequestMethod("GET");
                                conn.setConnectTimeout(5000);
                                conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)");

                                String fileName = TEST_URL.substring(TEST_URL.lastIndexOf("/") + 1);
                                file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), fileName);
                                int totalLength = conn.getContentLength();
                                int subLength = totalLength / 3;

                                for(int i = 0; i < 3; i++){
                                    int start = i * subLength;
                                    int end = (i+1) * subLength - 1;
                                    if(i == 2){
                                        end = totalLength;
                                    }
                                    HashMap<String, Integer> hashMap = new HashMap<>();
                                    hashMap.put("start", start);
                                    hashMap.put("end", end);
                                    hashMap.put("finished", 0);
                                    mDownloadInfoList.add(hashMap);
                                    new DownloadThread(i, start, end, file, url).start();
                                }

                            } catch (MalformedURLException e) {
                                e.printStackTrace();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }.start();
                }else{
                    for(int i = 0; i < 3; i++){
                        HashMap<String, Integer> hashMap = mDownloadInfoList.get(i);
                        int start = hashMap.get("start");
                        int end = hashMap.get("end");
                        int finished = hashMap.get("finished");
                        new DownloadThread(i, start + finished, end, file, url).start();
                    }
                }
            }
        });
    }

    class DownloadThread extends Thread{

        int threadId;
        int start;
        int end;
        File file;
        URL url;

        int currLength = 0;
        int totalLength;

        public DownloadThread(int threadId, int start, int end, File file, URL url){
            this.threadId = threadId;
            this.start = start;
            this.end = end;
            this.file = file;
            this.url = url;

            totalLength = end - start + 1;
        }

        @Override
        public void run() {
            try {
                if(start > end){
                    return;
                }
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)");
                conn.setRequestProperty("Range", "bytes=" + start + "-" + end);

                RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
                randomAccessFile.seek(start);

                HashMap<String, Integer> hashMap = mDownloadInfoList.get(threadId);
                InputStream is = conn.getInputStream();
                byte[] buf = new byte[1024 * 1024];
                int len;
                while((len = is.read(buf)) != -1 && mIsDownloading){
                    currLength += len;
                    hashMap.put("finished", currLength);
                    randomAccessFile.write(buf, 0, len);
                }

                is.close();
                randomAccessFile.close();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 断点续传下载功能实现

主要实现文件下载的暂停和继续下载功能。 用到的知识点: 1、Service的使用以及Service与Activity之间的数据交互; 2、SQLite数据库的简单使用; 3、文件下载与存储; ...
  • c19344881x
  • c19344881x
  • 2015年05月19日 16:22
  • 843

Android开发——断点续传原理以及实现

0.  前言在Android开发中,断点续传听起来挺容易,在下载一个文件时点击暂停任务暂停,点击开始会继续下载文件。但是真正实现起来知识点还是蛮多的,因此今天有时间实现了一下,并进行记录。本文原创,转...
  • SEU_Calvin
  • SEU_Calvin
  • 2016年12月19日 22:16
  • 18289

Android之——多线程断点续传下载示例

在上一篇博文中,我们讲解了如何实现Android的多线程下载功能,通过将整个文件分成多个数据块,开启多个线程,让每个线程分别下载一个相应的数据块来实现多线程下载的功能。多线程下载中,可以将下载这个耗时...
  • l1028386804
  • l1028386804
  • 2015年07月15日 21:02
  • 2901

Android网络编程 --断点续传下载文件

Android网络编程 --断点续传下载文件 2014年2月28日 2月最后一天 前言:关于断点续传下载文件,这个我好几个月之前面试的时候就遇到过,那时我确实迷惑了一下,Android开发分两...
  • wwj_748
  • wwj_748
  • 2014年02月28日 17:03
  • 25238

Android使用OKHttp3实现下载(断点续传、显示进度)

OKHttp3是如今非常流行的Android网络请求框架,那么如何利用Android实现断点续传呢,今天写了个Demo尝试了一下,感觉还是有点意思 准备阶段 我们会用到OKHttp3来做网络请求,使用...
  • cfy137000
  • cfy137000
  • 2017年02月03日 00:18
  • 7940

Android 实现文件的单线程断点续传下载

网络下载文件是一项很常用的技术,由此断点续传显得尤为重要了,下面来实现 一个单线程断点续传的demo,完成项目需要:基础网络知识(Http),了解android界面处理机制,Service的绑定与解绑...
  • ccapton
  • ccapton
  • 2017年01月09日 20:45
  • 1088

Android通过HTTP协议实现断点续传下载

FileDownloader.java ...
  • jaycee110905
  • jaycee110905
  • 2013年02月19日 20:11
  • 5865

使用xUtils框架实现多线程下载和断点续传

在前面的博客中分别介绍了在Java中实现多线程下载和断点续传以及在android中实现多线程下载和断点续传,这篇博客将介绍使用第三方框架xUtils实现多线程下载和断点续传 首先看一下实现的效果,点...
  • u010105970
  • u010105970
  • 2016年04月23日 17:26
  • 2779

多线程断点下载(开始下载,暂停下载,百分比进度条)

package cn.itcast.download;      import java.io.File;   import java.io.FileInputStream;   import...
  • scott2017
  • scott2017
  • 2016年02月27日 18:42
  • 342

Android上的断点续传下载原理

先说说断点续传的原理:这是HTTP 1.1协议的一部分,并不需要客户端特意去做多么复杂的事情。以前我曾经看过一个单位的技术标书,其中有下载的断点续传这一要求,给出的offer居然还挺高的... ...
  • u013339223
  • u013339223
  • 2015年12月08日 17:02
  • 1331
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android下载的断点续传的功能的实现
举报原因:
原因补充:

(最多只允许输入30个字)