android 多线程下载
看代码:
public class MainActivity extends AppCompatActivity {
private final String TAG = MainActivity.class.getCanonicalName();
private ImageView imageview;
private Button load;
private String path = "http://img06.tooopen.com/images/20160916/tooopen_sl_178994132446.jpg";
private int threadsum = 3;
private RandomAccessFile raf;
private File file;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageview = (ImageView) findViewById(R.id.imageview);
file = createFile(path);
load = (Button) findViewById(R.id.load);
load.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (null == raf){
try {
raf = new RandomAccessFile(file, "rwd");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
somethreadload(path,raf,threadsum);
}
});
}
private File createFile(String urlload) {
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
String absolutePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Picture";
int i = urlload.lastIndexOf("/");
String filepath = absolutePath + urlload.substring(i);
File file = new File(absolutePath);
if (!file.exists()){
file.mkdir();
}
//目标文件
File dstfile = new File(filepath);
if (!dstfile.exists()){
try {
dstfile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
dstfile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
return dstfile;
}else {
Log.e(TAG, "createFile: "+"没有sd卡" );
}
return null;
}
private void somethreadload(final String urlpath, final RandomAccessFile raf, final int sum) {
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(urlpath);
HttpURLConnection httpconn = (HttpURLConnection) url.openConnection();
httpconn.setConnectTimeout(5000);
//总文件大小
int lengthsum = httpconn.getContentLength();
//设置成一样大小
raf.setLength(lengthsum);
raf.close();
Log.e(TAG, "run: "+"设置raf的大小:"+lengthsum );
//分配每个线程下载的大小
int bocket = lengthsum / sum;
for (int i = 0; i < sum; i++) {
int startsize = bocket*(i);
int endsize = bocket*(i+1);
if (sum-1 == i){
endsize = lengthsum;
}
Log.e(TAG, "run: "+"线程:"+i+" 下载"+startsize+"-->"+endsize );
mythread mythread = new mythread(urlpath,i,startsize,endsize,file);
mythread.start();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
class mythread extends Thread{
private final String pathuu;
private final int threadid;
private final File file;
private RandomAccessFile raf;
private final int startsize;
private final int endsize;
private String TAG = mythread.class.getCanonicalName();
public mythread(String path, int threadid, int startsize, int endsize, File file) {
this.pathuu = path;
this.threadid = threadid;
this.file = file;
this.startsize = startsize;
this.endsize = endsize;
}
@Override
public void run() {
super.run();
try {
URL url = new URL(pathuu);
Log.e(TAG, "run下载地址:: "+pathuu );
HttpURLConnection httpconn = (HttpURLConnection) url.openConnection();
httpconn.setConnectTimeout(5000);
httpconn.setRequestMethod("GET");
httpconn.setRequestProperty("Range","bytes="+startsize+"-"+endsize);
int code = httpconn.getResponseCode();
Log.e(TAG, "run: code:"+code );
if (206 == code){
InputStream is = httpconn.getInputStream();
byte[] buff = new byte[512];
int len;
raf = new RandomAccessFile(file, "rwd");
raf.seek(startsize);
// raf.skipBytes(startsize);
Log.e("tag", "run: "+"线程"+threadid+"开始下载" );
while((len = is.read(buff)) != -1){
raf.write(buff,0,len);
}
is.close();
raf.close();
Log.e(TAG, "run:raf的大小: "+raf.length() );
Log.e(TAG, "run: "+"线程"+threadid+"下载完毕" );
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我遇到的问题:所有的线程用的同一个RandomAcessFile对象,每一个线程都要有自己的对象;
我纠结了好久才发现的。。。。/(ㄒoㄒ)/~~
demo下载地址:https://github.com/renjiemei1225/SomeThreadLoad2
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 ...
随机推荐
- CentOS 6主机上的RStudio Server安装步骤
1. 安装EPEL库 yum -y install epel-release 2. 安装R yum install R 3. 安装OpenSSL yum install openssl098e 4. ...
- 崽崽帮www.zaizaibang.com精选1
南京郊外免费旅游景点推荐!不花钱又好玩~ 南艺帅哥手绘的南京,想说不爱你都难! [快乐 你懂的]—太原市育华幼儿园小一班 昆明周边游:那些近在咫尺的梨园 弘雅小学开展一年级新生入学准备期活动 大班的主 ...
- 关于Maven的一些记录
Eclipse-Mars4.5自带Maven插件,自己重新下载之后将不兼容. 可以在图中位置设置jar包路径. 可以在Eclipse新建Dynamic Web Project项目,然后在项目上右键=& ...
- [经验交流] 为 mesos framework 分配资源
前段时间我在办公网搭建了一套mesos平台,用于docker 集群相关的调研和测试,mesos + marathon + docker 架构运行正常.但是在启用了chronos后,marathon无法 ...
- 处理ios webview 更新缓存本地css、js后webview缓存无法更新的问题
项目中需要使用app本地css.js,并且可以根据服务下发自动更新本地css.js.测试发现只要更新后的css或者js和更新前路径一致,webview加载的还是更新前的css.js.怀疑是webvie ...
- 小例子 熟悉jquery
<div class="tab-head"> <h2 id="tab1" class="selected">JQGr ...
- Web性能测试工具JMeter
做Web方面的黑盒测试,也就是功能测试,基本不需要什么测试工具,都是直接打开浏览器访问,点一点界面就行. 现在流行的移动互联网应用,客户端和服务端的开发是分离的,两者开发进度肯定不一样,可能存在服务端 ...
- Linux常见命令
du -sh 查看当前文件夹大小 tail -f /var/log/nginx/access.log 查看日志 vsFTPd Linux上面的ftp df -lh 查看磁盘 df -i 查看inode ...
- Spring整合JUnit框架进行单元测试代码使用详解
一.Spring提供的JUnit框架扩展: 1. AbstractSpringContextTests:spring中使用spring上下文测试的Junit扩展类,我们一般不会使用这个类来进行单元 ...
- tornado 反向代理后 获取真实客户端IP
首先,nginx必定会设置一个Header传送过来真实的IP nginx.conf server { proxy_set_header X-Real-IP $remote_addr; location ...