Android 文件下载
来源:互联网 发布:百度文库离线文件json 编辑:程序博客网 时间:2024/05/17 23:44
1.使用 AsyncHttpClient 开源框架
AsyncHttpClient 开源框架可以使我们轻松地获取网络数据或者向服务器发送数据,最关键的是,它是异步框架,在底层使用线程池处理并发请求,效率很高,使用又特别简单。
以往我们在安卓上做项目,比如要下载很多图片、网页或者其他的资源,多数开发者会选择一个线程一个下载任务这种模型,因为安卓自带的 AndroidHttpClient 或者 java 带的 java.net.URL ,默认都是阻塞式操作。这种模型效率不高,对并发要求高的 APP 来讲,并不适用。有的人会选择使用 nio 自己实现,代码复杂度又很高。
AsyncHttpClient 作为 android-async-http 框架的一个核心应用类,使用简单,可以处理文本、二进制等各种格式的 web 资源。下面提供一些代码来看如何使用:
上面的代码演示了如何使用 AsyncHttpResponseHandler 和 BinaryHttpResponseHandler ,相信 AsyncHttpClient 会给大家带来很大的便利。
2.使用xUtils开源框架
public class XutilsDownloader {public static void download(final Context context,String url,final String target){HttpUtils http=new HttpUtils();http.download(url, target,true,new RequestCallBack<File>() {@Overridepublic void onSuccess(ResponseInfo<File> arg0) {Toast.makeText(context, "文件下载完成,保存在:"+target, 0).show();}@Overridepublic void onFailure(HttpException arg0, String arg1) {Toast.makeText(context, "文件下载失败,网络异常", 0).show();}});}}
3.自己实现线程下载
public class MulThreadDownloader implements Runnable{private int threadCount=3;//默认使用三个线程下载private String path;public MulThreadDownloader(int _threadCount,String path){this.threadCount=_threadCount;this.path=path;}@Overridepublic void run() {URL url;try {url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(3000);int code = conn.getResponseCode();if (200 == code) {int length = conn.getContentLength();RandomAccessFile raf = new RandomAccessFile(Environment.getExternalStorageDirectory()+"/temp.exe", "rw");raf.setLength(length);//计算每个子线程下载数据块大小:int blockSize = length / threadCount;for (int threadId = 0; threadId < threadCount; threadId++) {// blocksize=length/threadCount:10/3=3// 确定每个子线程下载数据的起始位置和结束位置:// 第0个线程:开始位置 0*3=0 结束位置:(0+1)*3-1// 第1个线程:开始位置 1*3=3 结束位置:(1+1)*3-1// ...// 第n个线程:开始位置 n*blocksize 结束位置:(n+1)*blocksize-1// n是线程的id// 最后一个子线程下载的结束位置:length-1int startIndex = threadId * blockSize;int endIndex = (threadId + 1) * blockSize - 1;if (threadId == (threadCount - 1)) {endIndex = length - 1;}// 创建子线程,下载对应数据块:new ChildThreadDownLoader(threadId,startIndex,endIndex,path).start();}}} catch (Exception e) {e.printStackTrace();}}}class ChildThreadDownLoader extends Thread{private int threadId;private int startIndex;private int endIndex;private String path;private static int runningThreadCount = 3;public ChildThreadDownLoader(int threadId, int startIndex, int endIndex,String path) {super();this.threadId = threadId;this.startIndex = startIndex;this.endIndex = endIndex;this.path = path;}@Overridepublic void run() {try {URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(3000);//告诉服务器子线程请求的数据范围conn.setRequestProperty("Range", "bytes="+startIndex+"-"+endIndex);//请求部分数据成功返回的响应码是206int code = conn.getResponseCode();if(206 == code){InputStream is = conn.getInputStream();RandomAccessFile raf = new RandomAccessFile(Environment.getExternalStorageDirectory()+"/temp.exe","rwd");raf.seek(startIndex);System.out.println("线程"+threadId+"正在下载..................."); byte[] buffer = new byte[1024*1024]; int len = 0;while((len = is.read(buffer)) != -1){raf.write(buffer, 0, len);}is.close();raf.close();}System.out.println("线程"+threadId+"下载完毕...................");//确定每个子线程什么下载完毕synchronized (ChildThreadDownLoader.class) {runningThreadCount --;if(runningThreadCount == 0){System.out.println("文件下载完成..............");}}} catch (Exception e) {e.printStackTrace();}}}
0 0
- Android 文件下载
- Android 文件下载
- android文件下载!download!
- android 文件下载
- android:文件下载
- Android 多线程文件下载
- android 文件的下载
- Android文件下载 HttpURLConnection
- 文件下载(java) android
- android 之文件下载
- android文件下载!download!
- Android文件下载
- Android之文件下载
- Android之文件下载
- android apk文件下载
- Android中的文件下载
- android 下载文件类
- Android开发 --- 文件下载
- 今年暑假不AC hdu2037 事件序列问题
- NYOJ--125 盗梦空间【水题】
- Linux命令2——cd
- 黑马程序员——c语言学习—作用域详解
- Android 遍历界面控件
- Android 文件下载
- Linux命令3——pwd
- 抓取网络json数据并存入mongodb(2)
- Objective-C的对象等同性
- Axure Mobile原型发布工具说明
- No CPU/ABI system image available for this barget
- unity之台湾游戏教父王俊博:做永远的抬轿人
- [CODEVS 3147] 矩阵乘法 2
- 关于项目