所用知识点:

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

  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. 【liunx】date命令总结

    命令简介: date 根据给定格式显示日期或设置系统日期时间.print or set the system date and time 指令所在路径:/bin/date 命令语法: date [OP ...

  2. LG2634 [国家集训队]聪聪可可

    题意 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好了,可是 ...

  3. redux笔记 进阶

    1 拆分UI组件和容器组件 import React from 'react' const AppUI = (props) =>{ return ( <div className=&quo ...

  4. Microsoft Bot Framework 上手

    因为这前使用过MS Bot Frameowrk 做过开发, 最近心血来潮想做(挖坑)一个小的bot. 今天带领大家使用MS Bot Framework创建Hello World. 首先,我们要创建项目 ...

  5. C 语言中的 switch 语句 case 后面是否需要加大括号

    事件原由为编辑器的自动缩进,当 case 换行后不自动缩进. 于是在在想可以可否在 case 后面再大括号,让其自动缩进. 查了资料,发现 case 是可以加大括号的,相当于代码块. 而且还有另外一个 ...

  6. 【转】iOS编译OpenSSL静态库(使用脚本自动编译)

    原文网址:https://www.jianshu.com/p/651513cab181 本篇文章为大家推荐两个脚本,用来iOS系统下编译OpenSSL通用库,如果想了解编译具体过程,请参看<iO ...

  7. django报错解决:Invalid HTTP_HOST header: 'xxx.com'. You may need to add u'xxx.com' to ALLOWED_HOSTS.

    django版本:1.11.15 使用uwsgi+nginx运行django程序,出现报错,报错为:Invalid HTTP_HOST header: 'xxx.com:82'. You may ne ...

  8. dojo:如何为表格添加从数据库获得存储的下拉框

    为表格添加下拉框的例子官网上就有,但如果下拉框的数据是从数据库请求的.需要有一些注意的地方. 首先希望实现的效果如下图所示: 表格初始数据为空,点击查询后获得表格表格数据,但下拉框的数据是在对应的fo ...

  9. WCF入门教程(二)从零做起-创建WCF服务

    通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) 定义了协议,具体什么操作,操作的参数和返回值 ...

  10. hadoop大数据基础框架技术详解

    一.什么是大数据 进入本世纪以来,尤其是2010年之后,随着互联网特别是移动互联网的发展,数据的增长呈爆炸趋势,已经很难估计全世界的电子设备中存储的数据到底有多少,描述数据系统的数据量的计量单位从MB ...