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 ...
随机推荐
- Xcode插件安装 错选了Skip Bundle解决办法
1.首先找到Xcode的UUID,在终端运行defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID ...
- day24:面向对象设计与面向对象编程、类和对象
一.三大编程范式: 面向过程: 面向函数: 面向对象: 二.程序的进化论: 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比方说,你定 ...
- Cannot get a connection, pool exhausted解决办法
http://blog.163.com/it_message/blog/static/8892051200908102032653/ 连接池(Tomcat+oracle),运行一段时间后就会出现 Ca ...
- UTF-8编码的字符串拆分成单字、获取UTF-8字符串的字符个数的代码及原理
一.字符编码简介 1. ASCII码 在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(by ...
- windows使用nginx实现网站负载均衡测试实例
如果你关注过nginx,必定知道nginx这个软件有什么用的,如果你的网站访问量越来越高,一台服务器已经没有办法承受流量压力,那就增多几台服务器来做负载吧.做网站负载可以买硬件设备来实现,比如F5,不 ...
- 开源共享一个训练好的中文词向量(语料是维基百科的内容,大概1G多一点)
使用gensim的word2vec训练了一个词向量. 语料是1G多的维基百科,感觉词向量的质量还不错,共享出来,希望对大家有用. 下载地址是: http://pan.baidu.com/s/1boPm ...
- Spark常用函数(源码阅读六)
源码层面整理下我们常用的操作RDD数据处理与分析的函数,从而能更好的应用于工作中. 连接Hbase,读取hbase的过程,首先代码如下: def tableInitByTime(sc : SparkC ...
- 学习C++的第三天
1.sort函数(默认升序排序(从小到大)) 要使用此函数只需用#include <algorithm> sort即可使用,语法描述为: sort(begin,end),表示一个 ...
- oracle数据库如何创建用户并授予角色
目标:1. 创建角色test1_role, 授予 CREATE PROCEDURE, CREATE SEQUENCE, CREATE SYNONYM, CREATE TABLE, CREATE T ...
- dubbo工作原理
part -- 外挂1.dubbo借助spring的schema启动和初始化 1.1 spring扫描所有jar下META-INF的spring.handlers和spring.schemas. 1. ...