android程序---->android多线程下载(二)
上篇我们讲到了android中下载的断点续传问题,今天我们开始学习下载的多线程问题。本次的多线程源码下载:androdi中多线程下载的实现代码。有关断点续传的问题,请参见博客:android程序---->android多线程下载(一)
目录导航
android中多线程下载的思路
一、 多线程下载的步骤说明:
第一步: 我们要获得下载资源的的长度,用http请求中HttpURLConnection的getContentLength()方法
第二步:在本地创建一个文件,设计其长度。File file = new File()
第三步:根据文件长度和线程数计算每条线程下载的数据长度和下载位置。
第四步:从下载的位置下载数据,通过connection.setRequestProperty("Range", "bytes=" + start + "-" + end)方法;
第五步:保存文件,使用RandomAccessFile类指定每条线程从本地文件的什么位置开始写入数据。
二、 根据文件长度和线程数计算每条线程下载的数据长度和下载位置:
aaarticlea/png;base64,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qlWrTExMBg4cOGDAADabHRISUk/Uqquru3XrRqfTTUxMTE1NGQzGhQsXoN44w9WrV3k8HpvNdnBw4HK5xsbGI0eOJHNzy5YtqCG0t7dHTezGjRshhBUVFQAAU1NTohYDAwMUjqGhITpCoVA4HI6BgcH9+/c7deqEmhwajdaiRQtnZ2cajYZOMzMza9mypbm5OUEQAAAAwLlz5+7fv//DDz907tyZz+dHR0enpaVlZGRACKdOnWpqajpgwICsrKzjx48fOXKkqKjo7t27Q4cO9ff39/f3DwgICAgICAkJad++vb29fceOHUeNGuVXy/Dhw5OSklASrV27lk6nz549GwULANi/f39NTQ2TyezcubO+jP7b+or5T3gliyjDzMzMBg8eDCG0sbGZNm0ahJDFYpH+IISwU6dOHTt2JL9GRER07dr18uXLEEIXFxcOh1NUVIR+at++vZWV1Y0bN1BPpLKy8vjx4xkZGdnZ2TExMWw2e8mSJefOnZPJZBwOJy4uLicnR6lU/vDDD6h/ikhMTORyuVwu98yZM2TLLJVKmUxmmzZtkOai+D9//nz69Om5ubnFxcUpKSnW1tZGRkZI19AJqGbu2LGDw+Fwudxffvll/vz5pqamNjY2eXl5UM8/ffHiRevWrR0cHCCE586dKy8v37dv3+rVqy0sLLp37z5nzhwHBwc+n29kZER28U6cOIFqIISwvLycQqGIRCLyKZ48eWJkZOTt7d3Q14AQduzYkcfjrV27tuFPWq32xo0bt27d+v333ydPnszlcrds2XL//v07d+6oVCoejxccHHznzp3CwkKNRnP16tV3myBCT71161YOh8NkMgsLCy9fvmxqasrj8QIDA9GvZNvToUMHDw8Pf39/Ozs7U1NTJIukt/XVV18xmcxx48ZBCPPy8ng8HofDOXjwIITw119/tbOz4/P5SErkcjmfz+fz+U+fPn358iWDwXBzczt69GhmZqaqMdLT093d3S0sLO7evatSqQ4fPpyampqSkmJhYeHs7JySknL06NHU1NTQ0FA2mz1mzJi0tLSjR49+//33L1682LJlC5VKNTU15XA4DAbDyMioV69eDx8+dHBwsLS0ZLPZFArF0NCQRqPNmDHj559/BgCwWCwzMzNra2sLCwsWi8Xn883MzHg8HpfLtbGxsba25nA4AIAlS5agB+/SpQuLxcrO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" alt="" />
第一个线程从0~32字节处写入
第二个线程从33~65字节范围内写入
第三个线程从66~100字节范围内写入
android中多线程中的原理说明
对于多线程的下载,有两个需要学习的知识点就是
1. connection.setRequestProperty("Range", "bytes=" + start + "-" + end)方法,它用于请求指定范围内的数据。
2. RandomAccessFile类的seek方法从指定位置开始写入数据到文件:
一、 connection.setRequestProperty("Range", "bytes=" + start + "-" + end)方法:
我们写一个Java类进行测试,请求文件我本机上的android.txt文件是:http://192.168.250.232:8080/android.txt
My name is huhx, and my blog address is http://www.cnblogs.com/huhx.welcome to my blog.
测试类如下,Http请求2到10位置之间的数据,由于从0开始,所以请求的数据应该有12个字符为:name is huhx
package com.huhx.mutilthread; import java.net.HttpURLConnection;
import java.net.URL; public class MultiThread {
public static void main(String[] args) {
HttpURLConnection connection = null;
try {
URL url = new URL("http://192.168.250.232:8080/android.txt");
connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Range", "bytes=" + 3 + "-" + 14);
connection.setReadTimeout(5000);
connection.setRequestMethod("GET"); int length = -1;
if (connection.getResponseCode() == HttpURLConnection.HTTP_PARTIAL) {
length = connection.getContentLength();
}
if (length < 0) {
return;
}
byte[] buffer = new byte[length];
while ((length = connection.getInputStream().read(buffer)) != -1) {
System.out.println(new String(buffer));
System.out.println("length: " + buffer.length);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
connection.disconnect();
}
}
}
如我们所想打印结果如下:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJsAAAAsCAIAAAD9zF0WAAACc0lEQVR4nO2ayaHjIAxAqUsFUQ/V0AzFMAc2id2OPQn6ekdHEPCzCEFWXuCF+vYAhIcRo9wQo9z4FaNWKzDudnNnQCml7VvxB/ErRj/HGbhk6Gr8KUSj8ZnVWkXQZG2+mNIoRAPoEBkDUpPwaWqwHEEOb3O0dAQAq66cAW1yizgYnIthmPlbuvF5NNrmiX+ydnyBkqPOAL4RZR7WZrsGyK1K09YWPfK4qTOwI7X+xuaK1euHwxnAjxwxlydgNb7ejY+DdvSOnAMx2p05yTnqPESGS7E5Da7TfUxrlCwOG51MzF26jqZ8WHYGlkbJlqXEjIx6q/eSsqJnFGH1To4+ZjQ9S8clqF8bzeZ8Z10OkdTozV1ra5RcSN8y72FkDv/8763G5Zf3uDwlOyO6I4iTQesoaA1KqbKh0DYEg3F4D0JX3rkKvLSS+CudzMaPJgDGkNG28bN+DoHPvxchIEa5IUa5IUa5IUa5IUa5IUa5IUa5IUa5UdVe/vcRybOV56pelkGHRied/tyjztHFiflndGvMT1WeXSj1VWfu5Jw5Vf5Ys2G0V8GeVcjLUW05R22rbLlBv/JMurpioTFaTUWMDivYowp5VRXHvY1ytF959v5pozcrfWexMjquYK+rb01v61V3mmFbjHo484WEGyxzdPhc7xit7u+3jDaLBWfWq+6ogj0ygTtIb+z4+iO0R5kafWDV3XlHiRPZ6LDy7HvF570Kc3iFr/O2R/Wu3rjCfMFoPYFgcbwj48q7Jwyv/hcSurxiFCXpH1rufgQ5BeSGGOWGGOWGGOWGGOWGGOWGGOWGGOWGGOWGGOWGGOWGGOWGGOXGP7uO10IK7vQRAAAAAElFTkSuQmCC" alt="" />
二、 RandomAccessFile类的seek方法与多线程:
我们写一个线程Download,用于写入指定位置的数据到文件:
package com.huhx.randomfile; import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile; /**
*
* @author huhx
*
*/
public class Download implements Runnable {
private String content;
private int start; public Download(String content, int start) {
this.content = content;
this.start = start;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ", " + content);
File file = new File("output.txt");
RandomAccessFile accessFile = null;
try {
accessFile = new RandomAccessFile(file, "rwd");
accessFile.seek(start);
accessFile.write(content.getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
accessFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
在MainTest类中,开启三个线程写入数据:
我们用一个string[]数组进行模拟,从服务器通过setRequestProperty方法设置Range参数得到的数据:
package com.huhx.randomfile; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
*
* @author huhx
*
*/
public class MainTest { public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
String[] contents = {"hello", "world", "linux"};
for(int i = 0; i < 3; i ++) {
Download download = new Download(contents[i], i * contents[i].length());
executorService.execute(download);
}
executorService.shutdown();
}
}
打印结果如下:
pool-1-thread-2, world
pool-1-thread-1, hello
pool-1-thread-3, linux
并且output.txt文件内容如下,三个线程需要读的顺序有先后,但是最终的结果还是我们预期要的:
helloworldlinux
android中多线程下载的实现
有了上述android中多线程中原理的测试的理解,相信我们对于android中使用多线程下载有了比较不错的印象。现在我们通过实例,来讲述整个实现过程。本次的案例,为也避免内容的冗余,没有加断点续传的功能。项目结构如下:
aaarticlea/png;base64,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" alt="" />
在手机的存储卡,得到下载完成的文件:
aaarticlea/png;base64,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X311woQJx48fb2pqio6Onjt37pYtW7Zs2ULGOImT0uFwPPDAA+Hh4W+99da2bdseffTRK664YseOHeIoxsKFC//nf/7n008//e1vfzt58uRHHnmEYRgAwMaNG6dMmbJp06a0tLR33303MjJy0aJFRqORXJ24CdauXTtp0qTOzk7xj0SccL/61a+Cg4NLS0v7+/tvuumm6OjoV1555W9/+9u99957xRVX7N+/P0AgSOPcvn37FVdc8eijj37xxRebN2+Ojo5evHixxWJhGGb69OlRUVE33XTTe++99+67786bNy86OrqhocFsNt94443XXXfdxx9//K9//evZZ5+95557xo8fv3XrVkEQOjo6goKC7rrrrh07dvT29gY81aGhofLycn+BAACwLEtuX7wjjuOIn9Lj8fh8Pp7nGYYhkVRDQ0Nut1sM3+J53uVyeTwecoR8JIaAf2ler9c/xEO8os/nGxoaIj4mn8/nX6zX63U6neSZk0p6PB6n00mEj+d5q9VKrBWO43ie5zjO4XBcxk5Kp9NZUlJCBuMu+m2OPYFYtWrV7bffTr4i/nopl8sXLlxI+gh5eXm33nrr7Nmzb7vtNplMtm7duiVLlhA1MRqNmzZtmjdv3syZMxcuXLhz506WZSGELpfrhhtu+Pzzz9955525c+fOnTv3scceGxgYIE3F5XJ9+OGHN9544+zZs+fNm/fYY491d3eLEyIghH19fffcc88TTzzhH4ZELAuFQnHzzTf//e9/53m+ra3tkUcemTt37qxZs2688cYvvviC4zi32/3444+vX7/e4/GIfQqGYRITE2+44YbZs2fPnTv36aefNhgMxGfxy1/+8oknnigsLLzzzjvnzJlz5513ZmdnE1mRyWTE37lgwYLnnnuuq6vr1ltvfeedd8hX5/XXX589e/YvfvGLgoKCgKcaEGuETkeFEWfB91+E0/FXpJL+Gk1+K5z2raDTUZ5i4SJifjGYTbxoQOEks1iNgNAv/yOia1ksTRxMvRTN5icF+WORoXEqEILH4yEvloDj5LVG3kgYY6/X29/fT3r1Pp+PtD3yZQIAGI3G3t5el8tFziUqQN6KAIDBwUGTyeT/5iTfM6fTaTAYLBZLwKVJmeT04TE5pLPNMIx4xGQyGQwG0eNARjRIzQNao9vt7uvrI5URa+J2u71eL8/zbrebjLz6NzOX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" alt="" />
一、 在MainActivity中初始化开始下载按钮,绑定开始下载事件,传递参数文件的下载地址和文件的名称:
package com.example.linux.multithreaddownload; import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; /**
* writer: huhx
*/
public class MainActivity extends AppCompatActivity {
private Button startButon;
private String fileUrl = "http://f4.market.mi-img.com/download/AppStore/0548a945da1eb4bf830dac7e60a50aaf9883d03db/net.oschina.gitapp.apk";
private String fileName = "linux.apk";
private TextView textView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView);
textView.setText(fileName);
startButon = (Button) findViewById(R.id.start);
startButon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, DownloadService.class);
intent.setAction(DownloadService.DOWNLOAD_START);
intent.putExtra("fileUrl", fileUrl);
intent.putExtra("fileName", fileName);
startService(intent);
}
});
}
}
二、 在DownloadService的onStartCommand方法中,启动一个线程去请求下载文件的大小:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (DOWNLOAD_START.equals(intent.getAction())) {
fileUrl = intent.getStringExtra("fileUrl");
fileName = intent.getStringExtra("fileName");
// 开启多线程下载
new InitThread(fileUrl, fileName).start();
}
return super.onStartCommand(intent, flags, startId);
}
在InitThread线程中,代码如下,获取下载文件的长度,并发送下载的消息:
@Override
public IBinder onBind(Intent intent) {
return null;
}
/**
* 初始化子线程
*/
class InitThread extends Thread {
private String fileUrl;
private String fileName; public InitThread(String fileUrl, String fileName) {
this.fileUrl = fileUrl;
this.fileName = fileName;
} @Override
public void run() {
HttpURLConnection connection = null;
try {
URL url = new URL(fileUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
int length = -1;
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
// 获取文件的长度
length = connection.getContentLength();
}
if (length <= 0) {
return;
}
handler.obtainMessage(DOWNLOAD, length).sendToTarget();
} catch (Exception e) {
e.printStackTrace();
} finally {
connection.disconnect();
}
}
}
定义一个handler,用于消息的捕获及处理,在handleMessage方法中调用Download的download方法去下载文件:
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case DOWNLOAD:
int fileLength = (int) msg.obj;
Download download = new Download();
download.download(fileUrl, fileName, fileLength);break;
}
}
};
二、 在Download的类中,download方法用于开启多个线程去下载文件:
package com.example.linux.multithreaddownload; import android.content.Intent;
import android.os.Environment;
import android.widget.Toast; import java.io.File;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* Created by Linux on 2016/4/10.
*/
public class Download {
final static int THREAD_NUMBER = 3;
private ExecutorService executor = Executors.newFixedThreadPool(THREAD_NUMBER);
public static final String DOWNLOAD_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/download/"; public void download(String fileUrl, String fileName, int fileLength) {
int block = fileLength / THREAD_NUMBER;
File dir = new File(DOWNLOAD_PATH);
if (!dir.exists()) {
dir.mkdir();
}
File file = new File(dir, fileName);
for (int i = 0; i < THREAD_NUMBER; i++) {
long start = i * block;
long end = (i + 1) * block - 1;
if (i == THREAD_NUMBER - 1) {
end = fileLength;
}
DownloadThread downloadThread = new DownloadThread(fileUrl, file.getAbsolutePath(), start, end);
executor.execute(downloadThread);
}
executor.shutdown();
}
}
四、 在DownloadThread中具体去执行下载文件的任务:
package com.example.linux.multithreaddownload; import android.util.Log; import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL; /**
* Created by huhxon 2016/4/10.
*/
public class DownloadThread implements Runnable {
private String fileUrl;
private String filePath;
private long start;
private long end; public DownloadThread(String filUrl, String filePath, long start, long end) {
this.fileUrl = filUrl;
this.filePath = filePath;
this.start = start;
this.end = end;
} @Override
public void run() {
Log.i("Main", "thread: " + Thread.currentThread().getName() + ", start: " + start + ", end: " + end);
HttpURLConnection connection = null;
RandomAccessFile raf = null;
InputStream is = null;
try {
URL url = new URL(fileUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setRequestProperty("Range", "bytes=" + start + "-" + end); raf = new RandomAccessFile(new File(filePath), "rwd");
raf.seek(start);
if (connection.getResponseCode() == HttpURLConnection.HTTP_PARTIAL) {
is = connection.getInputStream();
byte[] buffer = new byte[4 * 1024];
int len;
while ((len = is.read(buffer)) != -1) {
raf.write(buffer, 0, len);
}
}
Log.i("Main", Thread.currentThread().getName() + "完成下载");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
raf.close();
is.close();
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
五、 在AndroidManifest.xml文件中定义服务和声明权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <service android:name=".DownloadService" android:exported="true" />
六、 打印日志结果如下:
- ::19.491 -/com.example.linux.multithreaddownload I/Main: thread: pool--thread-, start: , end:
- ::19.493 -/com.example.linux.multithreaddownload I/Main: thread: pool--thread-, start: , end:
- ::19.503 -/com.example.linux.multithreaddownload I/Main: thread: pool--thread-, start: , end: - ::36.642 -/com.example.linux.multithreaddownload I/Main: pool--thread-1完成下载
- ::37.119 -/com.example.linux.multithreaddownload I/Main: pool--thread-3完成下载
- ::37.254 -/com.example.linux.multithreaddownload I/Main: pool--thread-2完成下载
友情链接
- 关于android中断点续传下载 android程序---->android多线程下载(一)
- androdi中多线程下载的实现代码
android程序---->android多线程下载(二)的更多相关文章
- android程序---->android多线程下载(一)
多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务,可以使任务的执行速度变快.多线程的任务下载时常都会使用得到断点续传下载,就是我们在一次下载未结束时退出下载,第二次下载时会接着第一次 ...
- Android开发之多线程下载、断点续传、进度条和文本显示
代码实现了在Android环境下的多线程下载.断点续传.进度条显示和文本显示百分数: import java.io.BufferedReader; import java.io.File; impor ...
- 1.3.4分析你的第一个Android程序——Android第一行代码(第二版)笔记
切换项目结构模式 Project模式的项目结构 我们将项目切换成Project模式,这就是真实的目录结构. .gradle和.idea 这两个目下放置的都是Android Studio自动生成的一些文 ...
- Android程序项目结构(二)
利用Android Studio创建完第一个Hello World项目后,我们会看到使用project模式的项目结构. 一..gradle和.idea 这两个目录放置的是Android Studio自 ...
- Android之socket多线程(二)
使用ServerSocket创建服务器端: public static void main(String[] args) throws IOException { // TODO Auto-gener ...
- Android之——多线程下载演示样例
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载.Android API中明 ...
- 分析你的第一个Android程序
目录 分析你的第一个Android程序 Android模式的项目结构 切换项目结构模式 Project模式的项目结构 .gradle和idea app build(没有发现这个文件夹) gradle ...
- Android中多线程下载列表的封装实现(含进度反馈)
来源:http://blog.csdn.net/u011638883/article/details/17347015 实现了一下Android中的文件多线程下载模块,支持自定义线程数.断点续传.下载 ...
- Android中的多线程断点下载
首先来看一下多线程下载的原理.多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序"拼接"起来就 ...
随机推荐
- Meclipse alt+/ 没有提示
- 阿里云ecs 增加虚拟网卡
cd /etc/sysconfig/network-scripts/ #进入网卡目录 cp ifcfg-eth0 ifcfg-eth0:1 # 复制出ifcfg-eth0:1虚拟网卡 vi i ...
- HOW TO REPLACE ALL OCCURRENCES OF A CHARACTER IN A STD::STRING
From: http://www.martinbroadhurst.com/replacing-all-occurrences-of-a-character-in-a-stdstring.html T ...
- System Monitor for Mac(系统监控工具)破解版安装
1.软件简介 System Monitor 是 macOS 系统上的一款非常实用的 Mac 系统工具,System Monitor for mac 是一款六合一应用,您可以同时获得 CPU.RA ...
- nginx与apache的参考配置
nginx与apache是两大最主流的服务器,功能强大,但配置起来也比较麻烦,对于初学者来讲可能有些地方并不完全清楚其作用,这里搜集了一些配置的作用及其使用方法.其中nginx提供了推荐配置,而apa ...
- Cannot attach the file as database
Cannot attach the file as database这个异常是在EF的code frist里经常出现的,解决方法很简单,只要重新启动一下V11实例即可. CMD> sqlloca ...
- 把上传过来的多张图片拼接转为PDF的实现代码
以下是把上传过来的多张图片拼接转为PDF的实现代码,不在本地存储上传上来的图片,下面是2中做法,推荐第一种,把pdf直接存储到DB中比较安全. 如果需要在服务器上存储客户端上传的文件时,切记存储文件时 ...
- Core dump去哪里了?
转自:http://blog.csdn.net/normallife/article/details/53818997 今天程序Crash,去追踪,找core dump,始终没有找到,后来到了/pro ...
- jsonp的工作原理
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Mac安装crfpp
Mac安装crfpp 步骤 git clone https://github.com/taku910/crfpp.git ./configure make sudo make install cd p ...