- 浏览: 5770091 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
http://www.ideasandroid.com/archives/328#more-328
本文将介绍在android平台下如何实现多线程下载,大家都知道,android平台使用java做为开发语言,所以java中支持的多线程下载方式在android平台下都支持,其中主要有两种方式可以实现多线程下载。
一种方式是使用很多个线程分别下载文件的不同部分,最后把所有下载完的文件合并成一个文件。另一种方式是使用java为我们提供的RandomAccessFile类实现多线程的下载。
从性能上分析,第二种方式的存取速度会慢一些,但开发起来较为容易,不需要进行合并文件等操作。本文将使用第二种方式来实现多线程下载,最终效果如下图所示:
使用图形界面来获取需要下载的内容,并实时更新下载进度条,代码如下所示:
android多线程断点下载
http://llb988.blog.51cto.com/1940549/510035
Andorid多线程断点续传下载器
http://www.jcodecraeer.com/a/opensource/2015/0602/2978.html
Android 多线程下载 仿下载助手
http://blog.csdn.net/u011733020/article/details/47016715
本文将介绍在android平台下如何实现多线程下载,大家都知道,android平台使用java做为开发语言,所以java中支持的多线程下载方式在android平台下都支持,其中主要有两种方式可以实现多线程下载。
一种方式是使用很多个线程分别下载文件的不同部分,最后把所有下载完的文件合并成一个文件。另一种方式是使用java为我们提供的RandomAccessFile类实现多线程的下载。
从性能上分析,第二种方式的存取速度会慢一些,但开发起来较为容易,不需要进行合并文件等操作。本文将使用第二种方式来实现多线程下载,最终效果如下图所示:
使用图形界面来获取需要下载的内容,并实时更新下载进度条,代码如下所示:
import java.io.File; import java.net.URL; import java.net.URLConnection; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; /** * Copyright (C) 2010 ideasandroid * 演示android多线程下载 * 欢迎访问http://www.ideasandroid.com * 让程序开发不再那么神秘 */ public class FileDownloadDemo extends Activity { private EditText downloadUrl; private EditText downloadFileName; private EditText downloadThreadNum; private Button downloadBt; private ProgressBar downloadProgressBar; private TextView progressMessage; private int downloadedSize = 0; private int fileSize = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); downloadUrl = (EditText) findViewById(R.id.downloadUrl); downloadFileName = (EditText) findViewById(R.id.downloadFileName); downloadThreadNum = (EditText) findViewById(R.id.downloadThreadNum); progressMessage = (TextView) findViewById(R.id.progressMessage); downloadBt = (Button) findViewById(R.id.downloadBt); downloadProgressBar = (ProgressBar) findViewById(R.id.downloadProgressBar); downloadProgressBar.setVisibility(View.VISIBLE); downloadProgressBar.setMax(100); downloadProgressBar.setProgress(0); downloadBt.setOnClickListener(new OnClickListener() { public void onClick(View v) { download(); } }); } private void download() { // 获取SD卡目录 String dowloadDir = Environment.getExternalStorageDirectory() + "/ideasdownload/"; File file = new File(dowloadDir); //创建下载目录 if (!file.exists()) { file.mkdirs(); } //读取下载线程数,如果为空,则单线程下载 int downloadTN = Integer.valueOf("".equals(downloadThreadNum.getText() .toString()) ? "1" : downloadThreadNum.getText().toString()); //如果下载文件名为空则获取Url尾为文件名 int fileNameStart = downloadUrl.getText().toString().lastIndexOf("/"); String fileName = "".equals(downloadFileName.getText().toString()) ? downloadUrl .getText().toString().substring(fileNameStart) : downloadFileName.getText().toString(); //开始下载前把下载按钮设置为不可用 downloadBt.setClickable(false); //进度条设为0 downloadProgressBar.setProgress(0); //启动文件下载线程 new downloadTask(downloadUrl.getText().toString(), Integer .valueOf(downloadTN), dowloadDir + fileName).start(); } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { //当收到更新视图消息时,计算已完成下载百分比,同时更新进度条信息 int progress = (Double.valueOf((downloadedSize * 1.0 / fileSize * 100))).intValue(); if (progress == 100) { downloadBt.setClickable(true); progressMessage.setText("下载完成!"); } else { progressMessage.setText("当前进度:" + progress + "%"); } downloadProgressBar.setProgress(progress); } }; /** * @author ideasandroid * 主下载线程 */ public class downloadTask extends Thread { private int blockSize, downloadSizeMore; private int threadNum = 5; String urlStr, threadNo, fileName; public downloadTask(String urlStr, int threadNum, String fileName) { this.urlStr = urlStr; this.threadNum = threadNum; this.fileName = fileName; } @Override public void run() { FileDownloadThread[] fds = new FileDownloadThread[threadNum]; try { URL url = new URL(urlStr); URLConnection conn = url.openConnection(); //获取下载文件的总大小 fileSize = conn.getContentLength(); //计算每个线程要下载的数据量 blockSize = fileSize / threadNum; // 解决整除后百分比计算误差 downloadSizeMore = (fileSize % threadNum); File file = new File(fileName); for (int i = 0; i < threadNum; i++) { //启动线程,分别下载自己需要下载的部分 FileDownloadThread fdt = new FileDownloadThread(url, file, i * blockSize, (i + 1) * blockSize - 1); fdt.setName("Thread" + i); fdt.start(); fds[i] = fdt; } boolean finished = false; while (!finished) { // 先把整除的余数搞定 downloadedSize = downloadSizeMore; finished = true; for (int i = 0; i < fds.length; i++) { downloadedSize += fds[i].getDownloadSize(); if (!fds[i].isFinished()) { finished = false; } } //通知handler去更新视图组件 handler.sendEmptyMessage(0); //休息1秒后再读取下载进度 sleep(1000); } } catch (Exception e) { } } } }
import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.net.URL; import java.net.URLConnection; import android.util.Log; /** * Copyright (C) 2010 ideasandroid * 演示android多线程下载 * 欢迎访问http://www.ideasandroid.com * 让程序开发不再那么神秘 * * 单个下载线程 */ public class FileDownloadThread extends Thread{ private static final int BUFFER_SIZE=1024; private URL url; private File file; private int startPosition; private int endPosition; private int curPosition; //用于标识当前线程是否下载完成 private boolean finished=false; private int downloadSize=0; public FileDownloadThread(URL url,File file,int startPosition,int endPosition){ this.url=url; this.file=file; this.startPosition=startPosition; this.curPosition=startPosition; this.endPosition=endPosition; } @Override public void run() { BufferedInputStream bis = null; RandomAccessFile fos = null; byte[] buf = new byte[BUFFER_SIZE]; URLConnection con = null; try { con = url.openConnection(); con.setAllowUserInteraction(true); //设置当前线程下载的起点,终点 con.setRequestProperty("Range", "bytes=" + startPosition + "-" + endPosition); //使用java中的RandomAccessFile 对文件进行随机读写操作 fos = new RandomAccessFile(file, "rw"); //设置开始写文件的位置 fos.seek(startPosition); bis = new BufferedInputStream(con.getInputStream()); //开始循环以流的形式读写文件 while (curPosition < endPosition) { int len = bis.read(buf, 0, BUFFER_SIZE); if (len == -1) { break; } fos.write(buf, 0, len); curPosition = curPosition + len; if (curPosition > endPosition) { downloadSize+=len - (curPosition - endPosition) + 1; } else { downloadSize+=len; } } //下载完成设为true this.finished = true; bis.close(); fos.close(); } catch (IOException e) { Log.d(getName() +" Error:", e.getMessage()); } } public boolean isFinished(){ return finished; } public int getDownloadSize() { return downloadSize; } }
android多线程断点下载
http://llb988.blog.51cto.com/1940549/510035
Andorid多线程断点续传下载器
http://www.jcodecraeer.com/a/opensource/2015/0602/2978.html
Android 多线程下载 仿下载助手
http://blog.csdn.net/u011733020/article/details/47016715
评论
11 楼
我真的叫王俊华
2016-03-30
caoqiuw 写道
谢谢分享,这个很好用,学习了! 如果有什么新的发现,我们一起来完善!
10 楼
lishijie302
2014-09-29
FileDownloadThread 中为什么没有关闭http连接呢!
9 楼
nightwish12075
2014-09-17
这种效率,开玩笑
8 楼
cn23snyga
2013-07-09
[url]http://www.ideasandroid.com [/url]
原创地址,无法访问!
原创地址,无法访问!
7 楼
何仙儿
2012-08-21
确实不对应啊,弄好再上传啊!
6 楼
weixiaojulebu
2011-12-15
貌似demo跟上面的代码不对应吧!
5 楼
winerdaxian
2011-08-27
主啊,貌似效率很有问题啊
4 楼
winerdaxian
2011-08-27
谢谢主了哦
3 楼
caoqiuw
2011-08-02
谢谢分享,这个很好用,学习了! 如果有什么新的发现,我们一起来完善!
2 楼
yangjiantong
2011-04-13
请问一下楼主有没有在服务中进行多线程下载的demo?
1 楼
wxw404
2011-03-23
你好!我这边请求下载的url并不是文件地址,而是带json格式的post方式的请求url,服务端接受后验证账号,而后 返回错误json或文件流。这样的方式使用“Range”加断点,是否有效?
另外我测试过RandomAccessFile这个存储文件速度较慢,是否有优化的方案?
另外我测试过RandomAccessFile这个存储文件速度较慢,是否有优化的方案?
发表评论
-
http://www.android-studio.org/
2018-08-06 09:25 0http://www.android-studio.org/ ... -
SlidingDrawer源码
2012-03-14 10:13 3764我把SlidingDrawer源码提了出来,希望对1.5的朋友 ... -
简单拖动效果(带Cache,需要完善)
2011-10-13 15:10 4174如何去实现一个具有幻象的拖拽效果? 所谓”幻象“就是当你按下去 ... -
Android Activity中启动另一应用程序的方法,无需得到类名
2011-08-02 14:46 17181在网上搜索了一会相关的实现代码,发现所有的文章都说是需要包名和 ... -
java-universal-tween-engine,一个动画系统库
2011-06-29 09:21 6687http://code.google.com/p/java-u ... -
网上发现的一个android UI包
2011-05-24 12:21 4042里面有些UI和效果 -
android中使用代码启动其他程序
2011-04-29 23:15 5214你要訪問其他的程序,那麼這個程序要先裝載到模擬器或真機上面,因 ... -
listView背景问题以及限制editText字数以及如果想通知别人已经不能在写
2011-04-29 22:44 31531.在listView设置好背景之后 你如果点击空白出 你会发 ... -
Android键盘和触摸事件处理
2011-04-29 22:32 6956activity和VIEW都能接收触摸和按键,如果响应事件只需 ... -
Android的绘制文本对象FontMetrics的介绍及绘制文本
2011-04-29 22:29 11453一。Android绘制文本对象FontMetrics介绍 ... -
Android View 拖动&插入
2011-04-29 22:20 3496View 拖动&插入 即: 支持 拖动图标 然后 ... -
使TextView文本可以水平和垂直滚动
2011-04-29 21:59 14319在做一个小的电子书程序,要求电子书具有放大缩小的功能,所以肯定 ... -
ArrayAdapter源码
2011-04-29 12:29 6255看看人家怎么写的。 /* * Copyright (C ... -
Android下获取开机时间
2011-04-02 21:51 6175找了一圈没发现能得到开机启动时间资料,于是乎突发奇想,得到了解 ... -
AutoCompleteTextView连接到数据库
2011-03-30 20:49 4643AutoCompleteTextView可以根据输入 ... -
改变屏幕Brightness(亮度)
2011-03-30 12:48 4557http://www.eoeandroid.com/forum ... -
android 拖拽图片&拖动浮动按钮到处跑
2011-02-24 20:55 31678来自老外: import android.app.Acti ... -
拖动一个控件在另一个控件(layout)上,并固定位置在几个位置显示
2011-02-24 20:51 5842实现效果: 鼠标拖动btn SSS,SSS在水平的layo ... -
Handler与Message类,实现n秒后无操作自动消失功能
2011-02-24 20:45 4587实现功能:某控件不操作10秒后,自动消失。如照相机变焦条出现后 ... -
带删除按钮的ListView
2011-02-24 10:33 6106不用说了,上图先: import java.util.A ...
相关推荐
基于android实现下载网络资源,文件、多媒体等,采用多线程,实现了断点续传。
实现文件的断点续传功能,进行文件的双方面下载功能,实现文件的断点续传功能,简单明了
java和Android文件下载断点续传和图片下载代码实现, 可直接复制代码, 实现多种文件下载,
《Android多线程断点续传下载网络上的音/视频等各种文件》多线程,断点续传,各种网络上的数据,下载网络上的数据时基本功!加油了各位!
OKHttp3是如今非常流行的Android网络请求框架,那么如何利用Android实现断点续传呢,今天写了个Demo尝试了一下,感觉还是有点意思 准备阶段 我们会用到OKHttp3来做网络请求,使用RxJava来实现线程的切换,并且开启Java8...
Android实现网络多线程下载,断点续传,压缩包内有两个项目: downloadDemo:多线程下载 MulThreadDownloader:断点续传(网上别人的项目)
android客户端的 文件的断点续传上传 使用的socket上传 针对是post请求 考虑到可能上传的数据比较大 会比较耗时 故使用了断点续传的 功能
Android:文件下载(网络监控断点续传),并进行解压。
实现Android大文件断点续传功能,如果上传文件不大小于2M可以使用Http上传,如果太大可以使用此方法
Demo实现多文件分段断点续传功能,详情请看http://blog.csdn.net/a1533588867/article/details/53129259
使用java 语言实现的 Socket文件断点续传 ,可用于Android开发。
连接FTP服务器,实现文件的上传,删除功能,可以断点续传,支持退出重进App续传,断网重连续传。
真心收集的 android 断点续传文件实现
通过这个Android源码可学习一下如何基于Java代码实现断点续传的应用,比如如何设置当前线程下载的起点、终点,设置断点续传的开始位置,设置User-Agent ,httpURLConnection.setRequestProperty("User-Agent",...
使用多线程的好处:使用多线程下载会提升文件下载的速度。那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度。 HttpURLConnection.getContentLength();//获取下载文件...
2.断点续传: 对于每一个线程利用一个DownloadInfo类来保存下载的信息,每次在下载过程中向数据库更新信息(我也有想过只在下载暂停时进行更新,但那样的话我们的进程被杀掉时信息就无法保存下来)。在进行下载之前...
http://www.ibm.com/developerworks/cn/java/joy-down/index.html参考文章以上,主要实现在android系统里断点续传下载任意类型的文件....可以在DDMS里查看文件的实际下载进度,可以再LOGCAT里查看系统的Log日志,...
文件断点续传demo 快速实现文件上次功能..............................................................................................
一、概述 在上一篇博文《Android多线程下载示例》中,我们讲解了如何实现Android的多线程下载功能,通过将整个文件分成多个数据块,开启多个线程,让每个线程分别下载一个相应的...这篇文章主要是讲解如何实现断点下