Android菜鸟之路-多线程下载

Android客户端下载步骤

  1. 在Android客户端首先创建一个空文件(空白文件),大小跟服务器的一模一样。
  2. 开启若干线程,分别去下载服务器上对应的资源。
  3. 如果所有的线程都下载完毕,服务器的资源就下载完毕。

Android客户端下载逻辑

  1. 获取到服务器端资源文件的大小(connection.getContentLength())

    String path = "http://localhost:8080/ff.exe";
    
    URL url = new URL(path);
    
    // 获取链接
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    
    // 参数
    connection.setRequestMethod("GET");
    connection.setConnectTimeout(5000);
    
    // 响应码
    int responseCode = connection.getResponseCode();
    
    if (responseCode == 200) {
    
        // 得到服务端返回的文件大小
        long contentLength = connection.getContentLength();
        System.out.println("服务器文件大小:"+contentLength);
    }
    
    // 断开连接
    connection.disconnect();
    
  2. 在本地创建一个大小和服务器一样的的空白文件
    File file = new File("temp.ext");
    RandomAccessFile raf= new RandomAccessFile(file, "rw");
    raf.setLength(contentLength);
    
  3. 根据开启线程的数量,把服务器资源给等分成若干份(threadCount:线程数量)
    假设文件大小是10个byte。(长度:length)
    假设3个线程(线程数量:threadCount)。
     int blockSize = length / threadCount;
    线程1 下载3个byte    1-3     0 * blockSize + 1 ~ 1 * blockSize
    线程2 下载3个byte    4-6     1 * blockSize + 1 ~ 2 * blockSize
    线程3 下载4个byte    7-10    2 * blockSize + 1 ~ 3 * blockSize(length)
    
    // 开启若干个子线程,分别去下载对应的资源
    long threadCount = 3;
    long blockSize = contentLength / threadCount;
    
    for (int i = 1; i <= threadCount; i++) {
        // 计算下载起始、结束位置
        long startIndex = (i - 1) * blockSize + 0;// 服务器也是从0开始
        long endIndex = i * blockSize - 1; //
        // 最后一个线程
        if (i == threadCount) {
            endIndex = contentLength - 1;
        }
        System.out.println("开启线程:" + i + ",下载的位置:(" + startIndex + "~"
                + endIndex + ")");
        new DownloadThread(i, startIndex, endIndex, path).start();
    }
    
  4. 创建线程类
    static class DownloadThread extends Thread {
        private int threadId;
        private long startIndex;
        private long endIndex;
        private String path;
    
        public DownloadThread(int threadId, long startIndex, long endIndex,
                String path) {
            super();
            this.threadId = threadId;
            this.startIndex = startIndex;
            this.endIndex = endIndex;
            this.path = path;
        }
    
        public void run() {
            URL url;
            try {
                url = new URL(path);
    
                // 获取链接
                HttpURLConnection connection = (HttpURLConnection) url
                        .openConnection();
    
                // 参数
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(5000);
                // 告诉服务器下载的参数
                connection.setRequestProperty("Range", "bytes=" + startIndex
                        + "-" + endIndex);
    
                // 响应码
                int responseCode = connection.getResponseCode();
    
                System.out.println("服务器状态码:" + responseCode);
                // 下载服务器文件,返回的是206
                if (responseCode == 206) {
                    InputStream inputStream = connection.getInputStream();
    
                    File file = new File("temp.exe");
                    RandomAccessFile raf = new RandomAccessFile(file, "rw");
                    // 指定文件开始写的位置
                    raf.seek(startIndex);
                    System.out.println("第" + threadId + "个线程,写文件的开始、结束位置("
                            + (startIndex) + "," + (endIndex) + ")");
    
                    int len = 0;
                    byte[] buf = new byte[1024];
                    while ((len = inputStream.read(buf)) != -1) {
                        raf.write(buf, 0, len);
                    }
    
                    inputStream.close();
                    raf.close();
                    System.out.println("第" + threadId + "个线程下载完毕了");
    
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
时间: 2024-12-19 16:38:17

Android菜鸟之路-多线程下载的相关文章

android开发笔记之多线程下载及断点续传

今天我们来接触一下多线程下载,当然也包括断点续传,我们可以看到 很多下载器,当开通会员的时候下载东西的速度就变得快了许多,这是为什么呢?这就是跟今天讲的多线程有关系了,其实就是多开了几个线程一起下载罢了.当然真正的多线程下载要比这个复杂,要考虑很多问题. 做个不恰当的比喻: 假如我们把一个服务器上的文件看作是一个水缸里的水的话,那么多线程下载就相当于从水缸上打了多个小孔,然后塞进去小管道进行抽水.呵呵,也许这个比喻不够准确. 效果: 这里下载的是本地服务器上的文件,你们可以下载网络上的一些文件.

Android 使用HttpURLConnection 实现多线程下载

工具类代码: package com.example.xiaocool.multithreadclient; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class DownUtil {     // 定义下载资源的路径     private String path;     // 指定所下载

android菜鸟之路-事件分发机制总结(二)

ViewGroup事件分发机制 自己定义一个LinearLayout,ImageView和Button,小二,上代码 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android

Android中多线程下载列表的封装实现(含进度反馈)

来源:http://blog.csdn.net/u011638883/article/details/17347015 实现了一下Android中的文件多线程下载模块,支持自定义线程数.断点续传.下载任务的删除,添加等功能,这里封装了一下,功能已全部实现.不过由于使用的是最简单的手动线程数组及消息通知实现,可能还存在某些小问题.笔者会在后面的使用过程中再进行优化完善.先看一下程序测试效果,这里指定了5个下载任务,以及2个下载线程,具体如下: 要运行以上Demo需要自己搭建服务器,和简单,只需要把

Android多线程下载断点续传

先上图看卡结果: GITHUB:Android多线程下载断点续传 如图所示点击下载就开始下载,点击停止就会停止再次点击下载就会接着下载了. 设计思路是这样的: 首先通过广播将下载信息传递给DownService,DownService根据文件URL获取文件大小,再通过DownTask将下载任务分配,并且通过广播当点击停止下载时将下载进度保存在数据库中,当点击开始下载时再从数据库中获取到保存的进度,继续下载. 代码结构: 核心类是 DownLoadService,java 和DownTask.ja

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

你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效果图是同时开启三个下载任务,限制下载线程数量的效果图. 多线程下载原理 多线程下载的原理就是将下载任务分割成一个个小片段再将每个小片段分配给各个线程进行下载. 例如一个文件大小为100M,我们决定使用4个线程下载,那么每个线程下载的大小即为25M,每个线程的起始以及结束位置依次如下: 0: 0-25M 1: 25-50M 2: 50-75M 3

J哥---------Android 多线程下载 仿下载助手(改进版)

首先声明一点: 这里的多线程下载 并不是指的 多个线程下载一个 文件,而是 每个线程 负责一个文件.真正的多线程 希望后面能给大家带来.  -------------  欢迎 爱学习的小伙伴 加群  -------------  -------------android交流群:230274309------------- -------------一起分享,一起进步!  需要你们-------------- --------------  期待各位爱学习的小伙伴们 的到来------------

Android之——多线程下载示例(一)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载,Android API中明确要求将耗时的操作放到一个子线程中执行,文件的下载无疑是需要耗费时间的,所以要将文件的下载放到子线程中执行.下面,我们一起来实现一个Android中利用多线程下载文件的小例子. 二.服务端准备 在这个小例子中我以下载有道词典为例,在网上下载有道词典的安装包,在eclipse中新建项目web,将下载的

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

1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"