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 ...
随机推荐
- 【linux】 解决linux下vsftp 500 OOPS: cannot change directory:/home/ftp/ 办法
用FileZilla连接ftp出现错误,500 OOPS: cannot change directory:/home/ftp 原因是CentOS系统安装了SELinux,因为默认下是没有开启FTP的 ...
- [2014.01.27]wfChart 统计图组件 5.6
本组件支持多种样式图表,包括柱型图.横柱型图.曲线图.饼图.点图.区域图. 可选择的8大主题风格,且主题可再配置,在加快开发的同时又提供更好的图像效果. 组件图表提供两种输出接口,包括 ...
- C# WinForm 禁止最大化、最小化、双击标题栏、双击图标等操作(转载)
protected override void WndProc(ref Message m) { if (m.Msg==0x112) { switch ((int) m.WParam) { //禁止双 ...
- [LeetCode] 14. Longest Common Prefix
Write a function to find the longest common prefix string amongst an array of strings. public class ...
- 微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能
在做一个微信的微网站中的一个便民服务电话功能的应用,用到移动web页面中列出的电话号码,点击需要实现调用通讯录,网页一键拨号的拨打电话功能. 如果需要在移动浏览器中实现拨打电话,发送email,美国服 ...
- Codeforces Round #377 (Div. 2) D. Exams(二分答案)
D. Exams Problem Description: Vasiliy has an exam period which will continue for n days. He has to p ...
- [Linux] 关于Centos6中ulimit nproc用户进程数的限制
一.缘由: 在启动mongodb的时候,有Warning提示soft rlimits too low,就是用户使用进程数过小,遂调高系统资源关于用户最大进程数的限制ulimit -u. 先暂时使设置生 ...
- mysql解决Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp
同步发布:http://www.yuanrengu.com/index.php/mysqlsolvetimestamp.html 在使用mysql时,如果数据库中的字段类型是timestamp,默认为 ...
- eclipse @override注解出错
在工程中新建了一个接口,定义了一个methodA,然后写一个接口类实现该方法,并加上@override注解 项目提示@override出错,必须覆盖原方法XXX,解决办法 1)项目右键-project ...
- [Linux编程]__read_mostly变量含义
1.定义 __read_mostly原语将定义的变量为存放在.data.read_mostly段中,原型在include/asm/cache.h 中定义: #define __read_mostly ...