--------------------------------------------AndroidManifest.xml---------------------------------
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ch28"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<!-- 网络访问权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- sdcard权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
--------------------------------------------activity_main.xml------------------------------------
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="download" />
<ProgressBar
android:id="@+id/pbar"
android:layout_width="fill_parent"
android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal"/>
</LinearLayout>
--------------------------------------------MainActivity.java-------------------------------------
package com.ch28;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
/**
*
* 项目名称:com.ch28
* 类名称:MainActivity
* 类描述:断点下载
* 创建人:方勇
* 创建时间:2012-12-7 下午4:49:39
* Copyright (c) 方勇-版权所有
*/
public class MainActivity extends Activity implements OnClickListener {
private Button btn;
private ProgressBar pbar;
/* 文件总大小 */
private int fileSize;
/* 已下载大小 */
private int downloadsize;
/* 文件存放路径 */
private String path;
/* 更新进度条的值 */
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
pbar.setProgress(Double.valueOf(downloadsize * 1.0 / fileSize * 100).intValue());
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViews();
setListeners();
initdata();
}
private void findViews() {
btn = (Button) findViewById(R.id.btn);
pbar = (ProgressBar) findViewById(R.id.pbar);
}
private void setListeners() {
btn.setOnClickListener(this);
}
private void initdata() {
pbar.setVisibility(View.GONE);
pbar.setMax(100);
pbar.setProgress(0);
}
@Override
public void onClick(View v) {
/* 获取SDcard */
path = Environment.getExternalStorageDirectory() + "/downloads/";
File file = new File(path);
if (!file.exists()) {
file.mkdir();
}
/* 下载操作 */
new Thread(new DownLoadTask()).start();
/* 显示进度条 */
pbar.setVisibility(View.VISIBLE);
}
/* 子线程,计算下载量,更新UI */
class DownLoadTask implements Runnable {
/* 线程块大小,每个线程的下载量 */
private int blocksize;
/* 默认为5个线程 */
private int threadNum = 5;
/* 下载后的文件名 */
private String filename = "apache.zip";
@Override
public void run() {
/*数组保存线程对象,便于后面的每个线程下载量计算总和*/
FileDownLoad[] fileDownLoads = new FileDownLoad[threadNum];
/* 计算总大小 */
URL url;
try {
url = new URL("http://172.16.121.220:8080/download/apache.zip");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
/* 计算下载量 */
fileSize = conn.getContentLength();
/* 计算每个线程的下载量 */
blocksize = fileSize / threadNum;
/* 执行下载操作 */
for (int i = 0; i < threadNum; i++) {
/* 每个线程的开始位置 */
int begin = i * blocksize;
/* 每个线程的结束位置 */
int end = (i + 1) * blocksize - 1;
FileDownLoad thread = new FileDownLoad(url, begin, end, path + filename);
thread.start();
fileDownLoads[i] = thread;
}
/* 更新UI */
boolean flag = false;
while (!flag) {
flag = true;
for (int i = 0; i < threadNum; i++) {
downloadsize += fileDownLoads[i].getDownloadsize();
if (!fileDownLoads[i].isFinish()) {
flag = false;
}
}
MainActivity.this.handler.sendEmptyMessage(0);
Thread.sleep(1000);
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
--------------------------------------------FileDownLoad.java-----------------------------------
package com.ch28;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.URLConnection;
/*下载线程*/
public class FileDownLoad extends Thread {
private URL url;
private int begin;
private int end;
private int current;
private String filename;
/*缓冲输入流*/
private BufferedInputStream buffin;
/*写入流,支持断点*/
private RandomAccessFile raf;
/*缓冲大小*/
byte[] buffsize = new byte[1024];
/*已经下载大小*/
private int downloadsize;
private boolean isFinish;
public int getDownloadsize() {
return downloadsize;
}
public boolean isFinish() {
return isFinish;
}
public FileDownLoad(URL url, int begin, int end, String filename) {
super();
this.url = url;
this.begin = begin;
this.end = end;
this.filename = filename;
}
@Override
public void run() {
try {
URLConnection conn = url.openConnection();
/*指定下载的范围*/
conn.setRequestProperty("Range", "bytes="+begin+"-"+end);
conn.setAllowUserInteraction(true);
/*做缓冲优化处理*/
buffin = new BufferedInputStream(conn.getInputStream());
/*写入本地文件*/
raf = new RandomAccessFile(new File(filename), "rw");
/*移动到新的位置*/
raf.seek(begin);
while(current<end){
int size = buffin.read(buffsize, 0, 1024);
/*已经读完*/
if(size==-1){
break;
}
raf.write(buffsize, 0, size);
current+=size;
/*下载量*/
downloadsize+=size;
}
isFinish = true;
/*关闭输入流与写入流*/
buffin.close();
raf.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.run();
}
}
--------------------------------------------效果---------------------------------------------------
<!--EndFragment-->