看代码:

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 多线程下载的更多相关文章

  1. 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

    1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...

  2. android程序---->android多线程下载(一)

    多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务,可以使任务的执行速度变快.多线程的任务下载时常都会使用得到断点续传下载,就是我们在一次下载未结束时退出下载,第二次下载时会接着第一次 ...

  3. android程序---->android多线程下载(二)

    上篇我们讲到了android中下载的断点续传问题,今天我们开始学习下载的多线程问题.本次的多线程源码下载:androdi中多线程下载的实现代码.有关断点续传的问题,请参见博客:android程序--- ...

  4. Andoid 更好的Android多线程下载框架

    概述 为什么是更好的Android多线程下载框架呢,原因你懂的,广告法嘛! 本篇我们我们就来聊聊多线程下载框架,先聊聊我们框架的特点: 多线程 多任务 断点续传 支持大文件 可以自定义下载数据库 高度 ...

  5. 更好的Android多线程下载框架

    /** * 作者:Pich * 原文链接:http://me.woblog.cn/ * QQ群:129961195 * Github:https://github.com/lifengsofts */ ...

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

    来源:网易云课堂Android极客班第八次作业练习 练习内容: 多线程 asyncTask handler 多线程下载的原理 首先获取到目标文件的大小,然后在磁盘上申请一块空间用于保存目标文件,接着把 ...

  7. *Android 多线程下载 仿下载助手

    今天带来一个多线程下载的 样例.先看一下效果.点击 下载 開始下载,同一时候显示下载进度.完成下载,变成程 安装,点击安装 提示 安装应用. 界面效果 线程池 ThreadPoolExecutor , ...

  8. *Android 多线程下载 仿下载助手(改进版)

    首先声明一点: 这里的多线程下载 并非指的 多个线程下载一个 文件.而是 每一个线程 负责一个文件. 真正的多线程 希望后面能给大家带来.  -------------  欢迎 爱学习的小伙伴 加群 ...

  9. Android 多线程下载,断点续传,线程池

    你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效果图是同时开启三个下载任务,限制下载线程数量的 ...

  10. Android -- 多线程下载, 断点下载

    1. 原理图 2. 示例代码 需要权限 <uses-permission android:name="android.permission.INTERNET"/> &l ...

随机推荐

  1. spring.net xml 命名空间

    <objects    xmlns="http://www.springframework.net"    xmlns:xsi="http://www.w3.org ...

  2. 全景VR视频游戏外包公司:技术分享使用U3D+CB制作VR游戏

    随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51亿美元左 ...

  3. Android framework完整源码下载

    包括cpp等native代码.可zip打包下载. https://github.com/android/platform_frameworks_base/branches/stale Android线 ...

  4. nodejs概要

    1.什么是Node   Node.js 可能类似jquery.js?当不是. 首先Js包含(ECMAScript 即JS- ES  BOM  DOM三类),浏览器三种都可以运行,node中只能运行EC ...

  5. bug__android studio 出现布局文件不提示,且点击代码不能跟踪代码

    1,点击布局文件,出现  Cannot find declaration to  go to ? 且 点击代码不能跟踪代码? 把 项目的build.gradle 中的  compileSdkVersi ...

  6. XUtils 3 使用

    源代码:https://github.com/wyouflf/xUtils 基本使用:http://blog.csdn.net/abc6368765/article/details/50699334 ...

  7. 基于redis分布式锁实现“秒杀”

    转载:http://blog.5ibc.net/p/28883.html 最近在项目中遇到了类似“秒杀”的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓“秒杀”的基本思路. 业务场 ...

  8. 评论Beta版本发布

    1.  新蜂:俄罗斯方块 俄罗斯方块在完成了核心的游戏部分基础上增加了两个小功能,后续的内容还一些没完成,所以界面空出来很多板块,当前版本加入了下一个方块的预览功能,还加入了本地磁盘的排行榜.但是比起 ...

  9. G不可失

    html和css部分和引用的库 <!DOCTYPE html><html lang="en"><head> <meta charset=& ...

  10. 转WCF Proxy Authentication Required

    WCF Proxy Authentication Required The Problem When I’m in the office, I have to use an authenticated ...