android下载的断点续传的功能的实现
来源:互联网 发布:我的手机淘宝怎么打不开 编辑:程序博客网 时间:2024/05/29 10:10
前一篇博客介绍了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(); } } }}
0 0
- 实现断点续传功能的下载
- 实现断点续传功能的下载
- android下载的断点续传的功能的实现
- 断点续传功能的实现
- 断点续传下载的实现
- [Android]网络资源下载时断点续传的实现
- [Android]网络资源下载时断点续传的实现
- [Android]网络资源下载时断点续传的实现
- [Android]网络资源下载时断点续传的实现
- Android多线程断点续传下载的实现
- [Android]网络资源下载时断点续传的实现
- Android多线程断点续传下载的实现
- android断点续传下载实现的大致思路
- Android 断点续传下载功能实现
- 【Android开发经验】关于“多线程断点续传下载”功能的一个简单实现和讲解
- 【Android开发经验】关于“多线程断点续传下载”功能的一个简单实现和讲解
- Java实现的断点续传功能
- Java实现的断点续传功能
- Context.bindService()详解
- JavaWeb笔记-JSTL
- CCF 201512-4 送货(欧拉路径+字典序最小)
- deque c++ STL
- mysql error (ERROR大全)
- android下载的断点续传的功能的实现
- Qt动态库引用动态库,编译提示:无法打开包括文件
- cron表达式详解
- MariaDB主从配置
- 下载excel文件名字乱码问题处理
- 8大排序之 ---------归并排序 与时间复杂度
- 深入剖析Java中的装箱和拆箱
- 关于解决placeholder 颜色问题
- Java中导入、导出Excel