android多线程断点下载,带进度条和百分比显示,断点下载的临时数据保存到SD卡的文本文档中,建议可以保存到本地数据库中,这样可以提高存取效率,从而提高系统性能。

效果:
打开软件:
下载中:
下载完毕:
附代码如下:
package com.yy.multiDownloadOfBreakPoint;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
/**
* 多线程断点下载实例
* @author YUANYUAN
*
*/
public class MainActivity extends Activity {
//下载所使用的线程数
protected static final int threadCount = 3;
//下载完毕的标记
public static final int downloadOver = 1;
//更新下载进度标记
public static final int UPDATE_PROGRESS = 0;
//下载资源的路径输入框
private EditText et_path;
//下载的进度条
private ProgressBar pb;
//进度显示
private TextView tv_pb;
//当前累计下载的数据
int curDownCount=0;
//当前活动的下载线程数
protected static int activeThread;
//加入消息处理机制
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case downloadOver:
Toast.makeText(MainActivity.this, "文件已下载完毕!", Toast.LENGTH_LONG).show();
tv_pb.setText("下载完成");
break;
case UPDATE_PROGRESS:
//更新进度显示
tv_pb.setText("当前进度:"+(pb.getProgress()*100/pb.getMax())+"%");
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_path=(EditText) findViewById(R.id.et_path);
et_path.setText("http://192.168.2.114:8080/sqlite.exe");
pb=(ProgressBar) findViewById(R.id.pb);
tv_pb=(TextView) findViewById(R.id.tv_pb);
}
/**
* 开始下载
* @param view
*/
public void down(View view){
//获取下载资源的路径
final String path=et_path.getText().toString().trim();
//判断资源路径是否为空
if (TextUtils.isEmpty(path)) {
Toast.makeText(this, "请输入下载资源的路径", Toast.LENGTH_LONG).show();
return;
}
//开启一个线程进行下载
new Thread(){
public void run() {
try {
//构造URL地址
URL url=new URL(path);
//打开连接
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
//设置请求超时的时间
conn.setConnectTimeout(5000);
//设置请求方式
conn.setRequestMethod("GET");
//获取相应码
int code=conn.getResponseCode();
if (code==200) {//请求成功
//获取请求数据的长度
int length=conn.getContentLength();
//设置进度条的最大值
pb.setMax(length);
//在客户端创建一个跟服务器文件大小相同的临时文件
RandomAccessFile raf=new RandomAccessFile("sdcard/setup.exe", "rwd");
//指定临时文件的长度
raf.setLength(length);
raf.close();
//假设3个线程去下载资源
//平均每一个线程要下载的文件的大小
int blockSize=length/threadCount;
for (int threadId = 1; threadId <= threadCount; threadId++) {
//当前线程下载数据的开始位置
int startIndex=blockSize*(threadId-1);
//当前线程下载数据的结束位置
int endIndex=blockSize*threadId-1;
//确定最后一个线程要下载数据的最大位置
if (threadId==threadCount) {
endIndex=length;
}
//显示下载数据的区间
System.out.println("线程【"+threadId+"】开始下载:"+startIndex+"---->"+endIndex);
//开启下载的子线程
new DownloadThread(path, threadId, startIndex, endIndex).start();
//当前下载活动的线程数加1
activeThread++;
System.out.println("当前活动的线程数:"+activeThread);
}
}else{//请求失败
System.out.println("服务器异常,下载失败!");
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("服务器异常,下载失败!");
}
};
}.start();
}
/**
* 下载文件的子线程 每一个文件都下载对应的数据
* @author YUANYUAN
*
*/
public class DownloadThread extends Thread{
private String path;
private int threadId;
private int startIndex;
private int endIndex;
/**
* 构造方法
* @param path 下载文件的路径
* @param threadId 下载文件的线程
* @param startIndex 下载文件开始的位置
* @param endIndex 下载文件结束的位置
*/
public DownloadThread(String path, int threadId, int startIndex,
int endIndex) {
this.path = path;
this.threadId = threadId;
this.startIndex = startIndex;
this.endIndex = endIndex;
}
@Override
public void run() {
//构造URL地址
try {
File tempFile=new File("sdcard/"+threadId+".txt");
//检查记录是否存在,如果存在读取数据,设置真实下载开始的位置
if (tempFile.exists()) {
FileInputStream fis=new FileInputStream(tempFile);
byte[] temp=new byte[1024];
int length=fis.read(temp);
//读取到已经下载的位置
int downloadNewIndex=Integer.parseInt(new String(temp, 0, length));
//计算出已经下载的数据长度
int areadyDown=downloadNewIndex-startIndex;
//累加已经下载的数据量
curDownCount+=areadyDown;
//设置进度条已经下载的数据量
pb.setProgress(curDownCount);
//设置重新开始下载的开始位置
startIndex=downloadNewIndex;
fis.close();
//显示真实下载数据的区间
System.out.println("线程【"+threadId+"】真实开始下载数据区间:"+startIndex+"---->"+endIndex);
}
URL url = new URL(path);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
//设置请求属性,请求部分资源
conn.setRequestProperty("Range", "bytes="+startIndex+"-"+endIndex);
int code=conn.getResponseCode();
if (code==206) {//下载部分资源,正常返回的状态码为206
InputStream is=conn.getInputStream();//已经设置了请求的位置,所以返回的是对应的部分资源
//构建随机访问文件
RandomAccessFile raf=new RandomAccessFile("sdcard/setup.exe", "rwd");
//设置 每一个线程随机写文件开始的位置
raf.seek(startIndex);
//开始写文件
int len=0;
byte[] buffer=new byte[1024];
//该线程已经下载数据的长度
int total=0;
while((len=is.read(buffer))!=-1){//读取输入流
//记录当前线程已下载数据的长度
RandomAccessFile file=new RandomAccessFile("sdcard/"+threadId+".txt","rwd");
raf.write(buffer,0,len);//写文件
total+=len;//更新该线程已下载数据的总长度
System.out.println("线程【"+threadId+"】已下载数据:"+(total+startIndex));
//将已下载数据的位置记录写入到文件
file.write((startIndex+total+"").getBytes());
//累加已经下载的数据量
curDownCount+=len;
//更新进度条【进度条的更新可以在非UI线程直接更新,具体见底层源代码】
pb.setProgress(curDownCount);
//更新下载进度
Message msg=Message.obtain();
msg.what=UPDATE_PROGRESS;
handler.sendMessage(msg);
file.close();
}
is.close();
raf.close();
//提示下载完毕
System.out.println("线程【"+threadId+"】下载完毕");
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("线程【"+threadId+"】下载出现异常!!");
}finally{
//活动的线程数减少
activeThread--;
if (activeThread==0) {
for (int i = 1; i <= threadCount; i++) {
File tempFile=new File("sdcard/"+i+".txt");
tempFile.delete();
}
System.out.println("下载完毕,已清除全部临时文件");
//界面消息提示下载完毕
Message msg=new Message();
msg.what=downloadOver;
handler.sendMessage(msg);
}
}
}
}
}
以上这篇android多线程断点下载-带进度条和百分比进度显示效果就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# android多线程断点下载
# Android 下载文件通知栏显示进度条功能的实例代码
# Android编程实现显示在标题上的进度条功能【附源码下载】
# Android实现标题上显示隐藏进度条效果
# Android多线程+单线程+断点续传+进度条显示下载功能
# Android自定义多节点进度条显示的实现代码(附源码)
# Android使用AsyncTask下载图片并显示进度条功能
# Android 进度条显示在标题栏的实现方法
# Android上传文件到服务端并显示进度条
# Android实现支持进度条显示的短信备份工具类
# android实现动态显示隐藏进度条
# 进度条
# 多线程
# 临时文件
# 给大家
# 的是
# 希望能
# 请输入
# 这篇
# 数据库中
# 创建一个
# 小编
# 源代码
# 大家多多
# 计算出
# 是否存在
# 为空
# 进行下载
# 输入框
# 见底
# 显示效果
相关文章:
盐城做公司网站,江苏电子版退休证办理流程?
上海网站制作开发公司,上海买房比较好的网站有哪些?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
制作门户网站的参考文献在哪,小说网站怎么建立?
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
网页设计与网站制作内容,怎样注册网站?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
如何通过VPS建站无需域名直接访问?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
存储型VPS适合搭建中小型网站吗?
建站主机无法访问?如何排查域名与服务器问题
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
深圳网站制作培训,深圳哪些招聘网站比较好?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
如何通过二级域名建站提升品牌影响力?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
如何在七牛云存储上搭建网站并设置自定义域名?
网站制作公司排行榜,四大门户网站排名?
ui设计制作网站有哪些,手机UI设计网址吗?
魔方云NAT建站如何实现端口转发?
如何批量查询域名的建站时间记录?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
网站制作网站,深圳做网站哪家比较好?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
如何用IIS7快速搭建并优化网站站点?
建站OpenVZ教程与优化策略:配置指南与性能提升
制作网站的基本流程,设计网站的软件是什么?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
如何通过免费商城建站系统源码自定义网站主题与功能?
建站之星伪静态规则如何设置?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
建站上传速度慢?如何优化加速网站加载效率?
如何用wdcp快速搭建高效网站?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
如何用搬瓦工VPS快速搭建个人网站?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
小建面朝正北,A点实际方位是否存在偏差?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
建站之星如何助力企业快速打造五合一网站?
如何选择高性价比服务器搭建个人网站?
网站app免费制作软件,能免费看各大网站视频的手机app?
h5在线制作网站电脑版下载,h5网页制作软件?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
开心动漫网站制作软件下载,十分开心动画为何停播?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
高端网站建设与定制开发一站式解决方案 中企动力
*请认真填写需求信息,我们会在24小时内与您取得联系。