Android多线程下载
所用知识点:
1、设置http协议字段Range “bytes=“start+”-”+end
conn.addRequestProperty("Range", "bytes=" + start + "-" + end);
2、RandomAccessFile设置写入的位置
// 指定文件方式为可读写可操作
RandomAccessFile accessFile = new RandomAccessFile(new File(fileName),"rwd");
accessFile.seek(start);
3、开启多线程发送网络请求
// 启动下载
DownloadRunnable runnable = new DownloadRunnable(url,downLoadFile.getAbsolutePath(),start,end);
threadPool.execute(runnable);
DownLoad.java import android.os.Environment;
import android.os.Handler;
import android.os.Message; import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors; /**
*
*/
public class DownLoad { // 创建线程池
private Executor threadPool= Executors.newFixedThreadPool(3); private Handler handler; public DownLoad(Handler handler)
{
this.handler = handler;
} private class DownloadRunnable implements Runnable
{
private String url; private String fileName; private int start; private int end; public DownloadRunnable(String url,String fileName,int start,int end)
{
this.url = url;
this.fileName = fileName;
this.start = start;
this.end = end;
} @Override
public void run() {
try {
URL httpUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
conn.addRequestProperty("Range", "bytes=" + start + "-" + end);
// 指定文件方式为可读写可操作
RandomAccessFile accessFile = new RandomAccessFile(new File(fileName),"rwd");
accessFile.seek(start); InputStream in = conn.getInputStream();
// 设置缓冲区
byte b[] = new byte[4 + 1024];
int len =0;
while ((len = in.read(b))!=-1)
{
accessFile.write(b,0,len);
} if (accessFile!=null)
{
accessFile.close();
}
if (in!=null)
{
in.close();
}
Message message = Message.obtain();
message.what = 1;
handler.sendMessage(message); } catch (Exception e) {
e.printStackTrace();
}
}
} public void downLoadFile(String url)
{
try {
URL httpUrl = new URL(url);
try {
HttpURLConnection conn = (HttpURLConnection)httpUrl.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
int length = conn.getContentLength();
int block = length/3;
int start;
int end;
String fileName = getFileName(url);
File parent = Environment.getExternalStorageDirectory();
File downLoadFile = new File(parent,fileName);
/**
* 假如总长度为11
* block = 11/3=3
* 第一个线程下载0-block=0-2
* 第二个线程下载3-2*block-1= 3-5
* 第三个线程下载6-length=6-11
* */
for (int i=0;i<3;i++)
{
start = i*block;
end = (i+1)*block -1;
if (i == 2)
{
end = length;
}
// 启动下载
DownloadRunnable runnable = new DownloadRunnable(url,downLoadFile.getAbsolutePath(),start,end);
threadPool.execute(runnable);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
} private String getFileName(String url)
{
return url.substring(url.lastIndexOf("/"));
}
} MainActiviy.java 关键代码
private int count=0;
handler = new android.os.Handler()
{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
count +=msg.what;
// 说明三个线程都下载完成
if (count == 3)
{
textView.setText("Download Succ");
}
}
};
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
new DownLoad(handler).downLoadFile("http://192.168.0.103:8080/Pro_Test/aa.jpg");
}
}).start();
}
});
Android多线程下载的更多相关文章
- 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)
1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...
- android程序---->android多线程下载(一)
多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务,可以使任务的执行速度变快.多线程的任务下载时常都会使用得到断点续传下载,就是我们在一次下载未结束时退出下载,第二次下载时会接着第一次 ...
- android程序---->android多线程下载(二)
上篇我们讲到了android中下载的断点续传问题,今天我们开始学习下载的多线程问题.本次的多线程源码下载:androdi中多线程下载的实现代码.有关断点续传的问题,请参见博客:android程序--- ...
- Andoid 更好的Android多线程下载框架
概述 为什么是更好的Android多线程下载框架呢,原因你懂的,广告法嘛! 本篇我们我们就来聊聊多线程下载框架,先聊聊我们框架的特点: 多线程 多任务 断点续传 支持大文件 可以自定义下载数据库 高度 ...
- 更好的Android多线程下载框架
/** * 作者:Pich * 原文链接:http://me.woblog.cn/ * QQ群:129961195 * Github:https://github.com/lifengsofts */ ...
- android 多线程下载 断点续传
来源:网易云课堂Android极客班第八次作业练习 练习内容: 多线程 asyncTask handler 多线程下载的原理 首先获取到目标文件的大小,然后在磁盘上申请一块空间用于保存目标文件,接着把 ...
- *Android 多线程下载 仿下载助手
今天带来一个多线程下载的 样例.先看一下效果.点击 下载 開始下载,同一时候显示下载进度.完成下载,变成程 安装,点击安装 提示 安装应用. 界面效果 线程池 ThreadPoolExecutor , ...
- *Android 多线程下载 仿下载助手(改进版)
首先声明一点: 这里的多线程下载 并非指的 多个线程下载一个 文件.而是 每一个线程 负责一个文件. 真正的多线程 希望后面能给大家带来. ------------- 欢迎 爱学习的小伙伴 加群 ...
- Android 多线程下载,断点续传,线程池
你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效果图是同时开启三个下载任务,限制下载线程数量的 ...
- Android -- 多线程下载, 断点下载
1. 原理图 2. 示例代码 需要权限 <uses-permission android:name="android.permission.INTERNET"/> &l ...
随机推荐
- Linux内核设计基础(三)之定时器和时间管理
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/BlueCloudMatrix/article/details/29294529 内核知道连续两次时钟 ...
- dependencies、devDependencies、webpack打包 的区别与联系
为什么要在dependencies.devDependencies中声明依赖? 答:保证任何人在(或者你自己在其他设备上)对这个项目进行修改(开发)时,通过npm install就能获取同样的开发环境 ...
- Intellj(IDEA)中修改No artifacts configured问题
如下图,配置Deployment的时候,出现No artifacts configured错误 解决的方法
- MySQL程序之mysql参数详解
MySQL程序之mysql参数详解 mysql 是一个命令行客户程序,用于交互式或以批处理模式执行SQL语句 用法: mysql [OPTIONS] [database] 参数: 1.-? --hel ...
- zookkeper原理学习
zookkeper原理学习 https://segmentfault.com/a/1190000014479433 https://www.cnblogs.com/felixzh/p/58692 ...
- java架构师之路--推荐书籍
1.大型网站技术架构:核心原理与案例分析 本书通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计案例,为读者呈现一幅包括技术选 ...
- 把指定的字符串翻译成 pig latin。
freecodecamp上的算法题: 把指定的字符串翻译成 pig latin. Pig Latin 把一个英文单词的第一个辅音或辅音丛(consonant cluster)移到词尾,然后加上后缀 & ...
- jQuery模态框实现 后台添加删除修改Ip端口
主要用到,$('#i1').each(),标签里绑定函数可传参数this <!DOCTYPE html> <html lang="en"> <head ...
- <亲测>CentOS 7.3下Node.js 8.6安装配置(含NPM以及PM2)
CentOS 7.3下Node.js 8.6安装配置 2017年09月30日 14:12:02 阅读数:2245更多 个人分类: Nodejs 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- PowerPoint’s Menu is Too Big
转自: http://jdav.is/2016/08/31/powerpoints-menu-is-too-big/ It seems that when Microsoft deployed the ...