android多线程下载详解
本文将介绍在android平台下如何实现多线程下载,大家都知道,android平台使用java做为开发语言,所以java中支持的多线程下载方式在android平台下都支持,其中主要有两种方式可以实现多线程下载。
一种方式是使用很多个线程分别下载文件的不同部分,最后把所有下载完的文件合并成一个文件。另一种方式是使用java为我们提供的RandomAccessFile类实现多线程的下载。
从性能上分析,第二种方式的存取速度会慢一些,但开发起来较为容易,不需要进行合并文件等操作。本文将使用第二种方式来实现多线程下载,最终效果如下图所示:
第一步,我们先写一个线程类,来完成对指定区域的数据进行下载,如下所示:
Java代码
1. package com.ideasandroid.demo;
2.
3. import java.io.BufferedInputStream;
4. import java.io.File;
5. import java.io.IOException;
6. import java.io.RandomAccessFile;
7. import java.net.URL;
8. import java.net.URLConnection;
9.
10. import android.util.Log;
11. /**
12. * Copyright (C) 2010 ideasandroid
13. * 演示android多线程下载
14. * 欢迎访问http://www.zzzyk.com
15. * 让程序开发不再那么神秘
16. *
17. * 单个下载线程
18. */
19. public class FileDownloadThread extends Thread{
20. private static final int BUFFER_SIZE=1024;
21. private URL url;
22. private File file;
23. private int startPosition;
24. private int endPosition;
25. private int curPosition;
26. //用于标识当前线程是否下载完成
27. private boolean finished=false;
28. private int downloadSize=0;
29. public FileDownloadThread(URL url,File file,int startPosition,int endPosition){
30. this.url=url;
31. this.file=file;
32. this.startPosition=startPosition;
33. this.curPosition=startPosition;
34. this.endPosition=endPosition;
35. }
36. @Override
37. public void run() {
38. BufferedInputStream bis = null;
39. RandomAccessFile fos = null;
40. byte[] buf = new byte[BUFFER_SIZE];
41. URLConnection con = null;
42. try {
43. con = url.openConnection();
44. con.setAllowUserInteraction(true);
45. //设置当前线程下载的起点,终点
46. con.setRequestProperty("Range", "bytes=" + startPosition + "-" + endPosition);
47. //使用java中的RandomAccessFile 对文件进行随机读写操作
48. fos = new RandomAccessFile(file, "rw");
49. //设置开始写文件的位置
50. fos.seek(startPosition);
51. bis = new BufferedInputStream(con.getInputStream());
52. //开始循环以流的形式读写文件
53. while (curPosition < endPosition) {
54. int len = bis.read(buf, 0, BUFFER_SIZE);
55. if (len == -1) {
56. break;
57. }
58. fos.write(buf, 0, len);
59. curPosition = curPosition + len;
60. if (curPosition > endPosition) {
61. downloadSize+=len - (curPosition - endPosition) + 1;
62. } else {
63. downloadSize+=len;
64. }
65. }
66. //下载完成设为true
67. this.finished = true;
68. bis.close();
69. fos.close();
70. } catch (IOException e) {
71. Log.d(getName() +" Error:", e.getMessage());
72. }
73.
补充:移动开发 , Android ,