android下载的断点续传的功能的实现
2016-08-29 15:02
218 查看
前一篇博客介绍了android的多线程下载:
http://blog.csdn.net/whsdu929/article/details/52351807
下面来介绍一下下载过程中断点续传功能的实现。所谓的断点续传就是可以在下载过程中随时暂停下载,恢复下载时会从上次中断的地方继续下载,而不是从头开始。
断点续传的原理是:每次暂停下载时,记录保存每个线程当前下载到的位置,恢复下载时直接找到这个位置开始继续下载。
完整代码:
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 断点续传下载功能实现
- java服务端下载断点续传功能实现
- (二)使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能
- 关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)
- ios断点续传:通过NSURLSession实现文件下载功能
- android实现多线程断点续传功能
- 使用Java实现多线程下载断点续传功能案例
- 使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能
- 实现断点续传功能的下载
- Android实现多线程下载,断点续传,多任务下载
- Android实现文件下载断点续传
- 实现断点续传功能的下载
- Java servlet 简单实现http文件下载断点续传功能
- 关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)
- 在Android平台下通过HTTP协议实现断点续传下载。
- iphone开发--使用ASIHTTPRequest实现下载,断点续传功能
- 实现断点续传功能的下载
- 安卓(android)之实现断点下载功能
- JAVA写的多线程下载程序,并具有断点续传功能
- 使用Winnet的下载时,支持断点续传功能