android多线程断点续传下载文件
一、目标
1.多线程抢占服务器资源下载。
2.断点续传。
二、实现思路。
假设分为三个线程:
1.各个线程分别向服务器请求文件的不同部分。 这个涉及Http协议,可以在Header中使用Range参数设置向服务器请求文件的范围。
2.文件部分的合并。
2.1RandomAccessFile(随机读写文件类)。
2.2分别写三个文件,最后合并。
三、编码实现
这里使用RandomAcessFile来实现,首先实现了多线程下载。
public class MainActivity extends AppCompatActivity
implements View.OnClickListener {
int i = 0;
private int progress = 0;
android.os.Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final ProgressBar bar = (ProgressBar) findViewById(R.id.progressBar);
Button downBtn = (Button) findViewById(R.id.button);
final EditText tcEt= (EditText) findViewById(R.id.editText2);
Button restartBtn= (Button) findViewById(R.id.button2);
restartBtn.setOnClickListener(this);
final EditText urlEdit = (EditText) findViewById(R.id.editText);
downBtn.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
new Thread() {
@Override public void run() {
try {
URL url = new URL(urlEdit.getText().toString());
HttpURLConnection connection
= (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
int length = connection.getContentLength();
Log.i("xiahong","size:"+length);
if (length < 0) {
return;
}
bar.setMax(length);
File file = new File(
Environment.getExternalStorageDirectory()
.toString(), "donw.fiel");
RandomAccessFile randomAccessFile
= new RandomAccessFile(file, "rw");
randomAccessFile.setLength(length);
int conut=Integer.valueOf(tcEt.getText().toString());
int blockSize = length / conut;
for (int i = 0; i < conut; i++) {
int begin = i * blockSize;
int end = (i + 1) * blockSize;
if (i == conut-1) {
end = length;
}
//Create Thread to Download File
Runnable runnable= new DownloadRunable(begin,
end,file,
url,i) ; new Thread(runnable).start();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
});
mHandler=new android.os.Handler(){
@Override public void handleMessage(Message msg) {
bar.setProgress(progress);
}
};
} @Override public void onClick(View v) {
Intent intent=getBaseContext().getPackageManager()
.getLaunchIntentForPackage(getBaseContext().getPackageName());;
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent); } //文件下载类
class DownloadRunable implements Runnable {
private int begin;
private int end;
private File mFile;
private URL mURL;
private int id; public DownloadRunable(int begin, int end, File mFile, URL mURL, int id) {
this.begin = begin;
this.end = end;
this.mFile = mFile;
this.mURL = mURL;
this.id = id;
} @Override public void run() {
try {
HttpURLConnection connection
= (HttpURLConnection) mURL.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
connection.setRequestProperty("Range",
"bytes=" + begin + "-" + end);//向服务器请求文件范围。 InputStream is = connection.getInputStream();
byte[] bs = new byte[1024 * 1024];
RandomAccessFile randomAccessFile =
new RandomAccessFile(mFile, "rw");
randomAccessFile.seek(begin); int length = 0;
while ((length = is.read(bs)) != -1) {
randomAccessFile.write(bs, 0, length);
updateProgress(length);
}
is.close();
randomAccessFile.close();
} catch (IOException e) {
e.printStackTrace();
}
} synchronized void updateProgress(int len) {
progress += len;
mHandler.sendEmptyMessage(0);
}
}
}
下面实现断点续传。
实现思路就是将线程中耗时的循环操作加上一个Boolean类型的Flag标志,每次下载时将下载的进度保存到一个队列中,
在需要回复的时候重新创建线程,读取已保存的列表进行下载,即可。
android多线程断点续传下载文件的更多相关文章
- android 多线程断点续传下载
今天跟大家一起分享下Android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2次总结中已经为大家分享过有关技术的一些基 ...
- Android多线程断点续传下载
这个月接到一个项目.要写一个像360助手一样的对于软件管理的APP:当中.遇到了一个问题:多线程断点下载 这个 ,因为之前没有写过这方面的应用功能.所以.不免要自学了. 然后就在各个昂站上收索并整理了 ...
- Android多线程.断点续传下载
多线程,可断点续传的demo!最早写于2010.7! /** * @brief 主界面 * @author lixp */ public class HomeActivity exten ...
- 实现android支持多线程断点续传下载器功能
多线程断点下载流程图: 多线程断点续传下载原理介绍: 在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度手机端下载数据时难免会出现无信号断线.电量不足等情况,所以需要断点续传功能根据下 ...
- Android开发多线程断点续传下载器
使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点 ...
- Android之断点续传下载
今天学习了Android开发中比较难的一个环节,就是断点续传下载,很多人看到这个标题就感觉头大,的确,如果没有良好的逻辑思维,这块的确很难搞明白.下面我就将自己学到的知识和一些见解写下供那些在这个环节 ...
- win10环境下使用苹果虚拟机不要开多线程应用下载文件
win10环境下使用苹果虚拟机开多线程应用下载文件时候卡死,网络老掉. 8GB内存不够用?2.5mb网速不够用? 开的百度网盘下载个电影 结果虚拟机卡的不行 关了 网盘 挂起虚拟机 然后再 继续运行客 ...
- Android利用Http下载文件
Android利用Http下载文件 一.场景 下载存文本文件和下载如mp3等大容量的文件 界面 二.代码编写 1.AndroidMainfest.xml中配置 主要是解决网络权限和写SDCard的权限 ...
- Python之FTP多线程下载文件之多线程分块下载文件
Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...
随机推荐
- Django model.py表单的默认值 默认允许为空
Field.null 默认是null=False,这时不能传入NULL型数据,但是可以是空字符. 如果BooleanField中想要null数据类型,可以选择NullBooleanField Fi ...
- Macosx 安装 ionic 成功教程
一.首先介绍一下ionic ionic是一个用来开发混合手机应用的,开源的,免费的代码库.可以优化html.css和js的性能,构建高效的应用程序,而且还可以用于构建Sass和AngularJS的优化 ...
- 常用API——字符串String型函数
上图: 声明 var myString = new String(“Every good boy does fine.”); var myString = “Every good boy does f ...
- Mysql存储过程和函数区别介绍
存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表. 存储过程和函数存在以下 ...
- Tornado框架简析
Tornado是一款轻量级的Web服务器,同时又是一个开发框架.采用单线程非阻塞I/O模型(epoll),主要是为了应对高并发 访问量而被开发出来,尤其适用于comet应用. Tornado服务器3大 ...
- C++ 重载、重写、重定义
出自:http://blog.163.com/clevertanglei900@126/blog/ 1 成员函数重载特征: a 相同的范围(在同一个类中) b 函数名字相同 c 参数不同 d virt ...
- 理解 Node.js 里的 process.nextTick()
有很多人对Node.js里process.nextTick()的用法感到不理解,下面我们就来看一下process.nextTick()到底是什么,该如何使用. Node.js是单线程的,除了系统IO之 ...
- linux上安装subversion
1.安装svn服务器端 yum install subversion 从镜像下载安装svn服务器端 中间会提示是否ok,输入y,确认 安装成功提示:.....complete! 依次执行 ...
- [WPF系列]-Adorner
简介 通常我们想对现有的控件,做些修饰时我们就会想到一个装饰模式.WPF中也提供了这样的实现思路:通过将Adorner添加到AdornerLayer中来实现装饰现有控件的效果.如图示: 本来T ...
- jquery——移动端滚动条插件iScroll.js
官网:http://cubiq.org/iscroll-5 demo: 滚动刷新:http://cubiq.org/dropbox/iscroll4/examples/pull-to-refresh/ ...