当前位置:操作系统 > 安卓/Android >>

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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,