一:使用多线程实现下载
private EditText etpath;//服务地址
private LinearLayout ll ;
// 访问服务器
String path ;
// 设定线程的数量
int threadcount = 3;
//定义正在执行的线程数量
int runningThreadcount = threadcount ;
//建一个集合存放进度条
List<ProgressBar> list = new ArrayList<ProgressBar>() ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etpath = (EditText) findViewById(R.id.etpath);
ll = (LinearLayout) findViewById(R.id.ll) ;
// 加载进度条控件
for (int i = 0; i < threadcount; i++) {
ProgressBar pb = (ProgressBar)View.inflate(this, R.layout.pb, null) ;
}
}
public void download(View view){
//将进度条加入到线性组件中显示出来
for(int i = 0; i < threadcount; i++){
ll.addView(list.get(i));}
new Thread() {
public void run() {
path = etpath.getText().toString().trim();
if (TextUtils.isEmpty(path)) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "路径不能为空", 0)
.show();
}
});
return;
}
// 下载文件
try {
// 创建连接服务器对象
URL url = new URL(path);
HttpURLConnection http = (HttpURLConnection) url
.openConnection();
// 设定连接参数
http.setRequestMethod("GET");
// 设定连接的超时时间
http.setConnectTimeout(5000);
// 获取返回的状态吗
int code = http.getResponseCode();
if (code == 200) {
// 获得返回的文件的大小
int length = http.getContentLength();
// 2.创建一个文件和下载的文件大小一样
RandomAccessFile raf = new RandomAccessFile(
getFileName(path), "rw");
// 设置文件的大小
raf.setLength(length);
// 3.启动多个线程下载文件
for (int id = 0; id < threadcount; id++) {
// 计算每个线程要下载的区块大小
int blocksize = length / threadcount;
// 计算每个线程下载的开始和结束位置
int startIndex = id * blocksize;
int endIndex = (id + 1) * blocksize - 1;
// 特殊情况:最后一个线程需要承担更多的数据
if (id == threadcount - 1) {
endIndex = length - 1;
}
// 启动线程下载数据
DownLoadThread dlt = new DownLoadThread(path, id,
startIndex, endIndex);
dlt.start();
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "网络连接错误", 0).show() ;
}) ;
}
};
}.start();
}