一、目标

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多线程断点续传下载文件的更多相关文章

  1. android 多线程断点续传下载

    今天跟大家一起分享下Android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2次总结中已经为大家分享过有关技术的一些基 ...

  2. Android多线程断点续传下载

    这个月接到一个项目.要写一个像360助手一样的对于软件管理的APP:当中.遇到了一个问题:多线程断点下载 这个 ,因为之前没有写过这方面的应用功能.所以.不免要自学了. 然后就在各个昂站上收索并整理了 ...

  3. Android多线程.断点续传下载

    多线程,可断点续传的demo!最早写于2010.7! /** * @brief  主界面      * @author lixp  */ public class HomeActivity exten ...

  4. 实现android支持多线程断点续传下载器功能

    多线程断点下载流程图: 多线程断点续传下载原理介绍: 在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度手机端下载数据时难免会出现无信号断线.电量不足等情况,所以需要断点续传功能根据下 ...

  5. Android开发多线程断点续传下载器

    使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点 ...

  6. Android之断点续传下载

    今天学习了Android开发中比较难的一个环节,就是断点续传下载,很多人看到这个标题就感觉头大,的确,如果没有良好的逻辑思维,这块的确很难搞明白.下面我就将自己学到的知识和一些见解写下供那些在这个环节 ...

  7. win10环境下使用苹果虚拟机不要开多线程应用下载文件

    win10环境下使用苹果虚拟机开多线程应用下载文件时候卡死,网络老掉. 8GB内存不够用?2.5mb网速不够用? 开的百度网盘下载个电影 结果虚拟机卡的不行 关了 网盘 挂起虚拟机 然后再 继续运行客 ...

  8. Android利用Http下载文件

    Android利用Http下载文件 一.场景 下载存文本文件和下载如mp3等大容量的文件 界面 二.代码编写 1.AndroidMainfest.xml中配置 主要是解决网络权限和写SDCard的权限 ...

  9. Python之FTP多线程下载文件之多线程分块下载文件

    Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...

随机推荐

  1. AngularJS在IE8的支持

    AngularJS一般不会选择IE8支持, 因为很多特性在IE8下效果很差, 性能也不好, 但是由于项目的需要, 客户的机器有些是XP, 只能够装IE8, 所以为了解决这个, 我查阅了相关的资料,发现 ...

  2. OS的沙盒机制 --基础知识

    /* iOS的沙盒机制,应用只能访问自己应用目录下的文件. iOS不像android,没有SD卡概念,不能直接访问图像.视频等内容. iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙 ...

  3. iOS---用Application Loader 上传的时候报错No suitable application records were found. Verify your bundle identifier 'xx' is correct

    用Application Loader 上传的时候报错,突然发现用Application Loader的账号 竟然不是公司的账号  换成公司的账号 就可以了.

  4. 【代码笔记】iOS-获取字符串的宽度,高度

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...

  5. 活用UML-软件设计高手(广州 2014年6月14-15日)

    我们将在广州为您奉献高级技术课程”活用UML-软件设计高手“,首席专家张老师将会为您分享软件架构设计.数据库设计.用户体验设计及详细设计的最佳实践,帮助您成为优秀的软件设计师! 时间:2014.06. ...

  6. 报文格式:xml 、定长报文、变长报文

    目前接触到的报文格式有三种:xml .定长报文.变长报文 . 此处只做简单介绍,日后应该会深入学习到三者之间如何解析,再继续更新.——2016.9.23 XML XML 被设计用来传输和存储数据. H ...

  7. 2015-SH项目总结

    2015年,加入现在的公司(外包公司,名字就不说了),做SH项目(化名),在这个月(2016.01)结束了. 虽然公司也有做项目总结,不过我还是自己也总结一次. 项目概况: 这是个为一间私人会所提供全 ...

  8. 从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下

    阅读目录 序 将查询的结果写入文件系统 集群数据迁移一 集群数据迁移二 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephis ...

  9. SQL Server 2008 R2——用CTE进行递归计算求解累计值

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  10. Hadoop HDFS负载均衡

    Hadoop HDFS负载均衡 转载请注明出处:http://www.cnblogs.com/BYRans/ Hadoop HDFS Hadoop 分布式文件系统(Hadoop Distributed ...