Android 模拟多线程下载

以下是一个多线程下载的例子,见代码:

1、首先是布局文件

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent">
 5
 6
 7     <Button
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         android:text="下载"
11         android:id="@+id/btnDownLoad" />
12
13     <TextView
14         android:layout_width="wrap_content"
15         android:layout_height="wrap_content"
16         android:text="New Text"
17         android:id="@+id/tv"
18         android:layout_gravity="center_vertical" />
19 </LinearLayout>

  2、然后是对应的Activity文件

 1 import android.app.Activity;
 2 import android.os.Handler;
 3 import android.os.Message;
 4 import android.os.Bundle;
 5 import android.view.View;
 6 import android.widget.Button;
 7 import android.widget.TextView;
 8
 9 import com.yt.httpstudy.util.Download;
10
11
12 public class DownLoadActivity extends Activity {
13     private Button btnDown;
14     private TextView textView;
15     private int count = 0;
16     private Handler handler = new Handler(){
17         //接收信息并且处理
18         public void handleMessage(Message message){
19             int result = message.what;
20             count += result;
21            if(count ==3){
22                //下载完成后刷新页面
23                 textView.setText("下载完成!"+count);
24             }
25         }
26     };
27     @Override
28     protected void onCreate(Bundle savedInstanceState) {
29         super.onCreate(savedInstanceState);
30         setContentView(R.layout.activity_down_load);
31         btnDown = (Button) findViewById(R.id.btnDownLoad);
32         textView = (TextView) findViewById(R.id.tv);
33
34         btnDown.setOnClickListener(new View.OnClickListener() {
35             @Override
36             public void onClick(View view) {
37
38                 new Thread(){
39                     @Override
40                     public void run() {
41                         super.run();
42                         Download download = new Download(handler);
43                         //下载资源的地址
44                         download.downLoadFile("http://192.168.1.123:8080/test/asd.jpg");
45                     }
46                 }.start();
47             }
48         });
49     }
50 }

3、处理多线程下载

  1 import android.os.Environment;
  2 import android.os.Handler;
  3 import android.os.Message;
  4
  5 import java.io.File;
  6 import java.io.IOException;
  7 import java.io.InputStream;
  8 import java.io.RandomAccessFile;
  9 import java.net.HttpURLConnection;
 10 import java.net.MalformedURLException;
 11 import java.net.URL;
 12 import java.util.concurrent.Executor;
 13 import java.util.concurrent.Executors;
 14
 15 /**
 16  * Created by
 17  */
 18 public class Download {
 19
 20
 21     public   Handler handler;
 22     //创建线程池
 23     private Executor threadPool = Executors.newFixedThreadPool(3);
 24
 25     //构造器
 26     public Download(Handler handler){
 27         this.handler = handler;
 28     }
 29
 30     //线程池对象
 31     static class DownLoadRunnable implements  Runnable{
 32         //指定成员变量
 33         private String url;
 34         private String fileName;
 35         private long start,end;
 36         private Handler handler;
 37
 38         public DownLoadRunnable(String url,String fileName,long start,long end,Handler handler){
 39             this.url = url;
 40             this.fileName = fileName;
 41             this.start =  start;
 42             this.end = end;
 43             this.handler = handler;
 44
 45         }
 46         @Override
 47         public void run() {
 48
 49             HttpURLConnection conn = null;
 50             try {
 51                 URL httpUrl = new URL(url);
 52                 conn = (HttpURLConnection) httpUrl.openConnection();
 53                 conn.setRequestProperty("Range", "bytes=" + start + "-" + end);
 54                 conn.setRequestMethod("GET");
 55                 conn.setReadTimeout(5000);
 56
 57                 //往本地写文件
 58                 RandomAccessFile access = new RandomAccessFile(new File(fileName),"rwd");
 59                 access.seek(start);
 60                 //读取数据流
 61                 InputStream in = conn.getInputStream();
 62
 63                 //创建缓冲区
 64                 byte[] b = new byte[1024*4];
 65                 int len = 0;
 66                 while ((len = in.read(b)) !=-1){
 67                     access.write(b,0,len);
 68                 }
 69                 if(access !=null){
 70                     access.close();
 71                 }
 72                 if(in !=null){
 73                     in.close();
 74                 }
 75
 76                 //发送消息
 77                 Message message = new Message();
 78                 message.what =1;
 79                 handler.sendMessage(message);
 80             } catch (IOException e) {
 81                 e.printStackTrace();
 82             }
 83
 84         }
 85     }
 86
 87     public void downLoadFile(String url){
 88         try {
 89             URL httpUrl = new URL(url);
 90             HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
 91             conn.setRequestMethod("GET");
 92             conn.setReadTimeout(5000);
 93
 94             //获取下载内容长度
 95             int count = conn.getContentLength();
 96             int bloack = count/3;
 97
 98             //获取文件名
 99             String fileName = getFileName(url);
100
101             //获取外部设备名称
102             File parent  = Environment.getExternalStorageDirectory();
103             File fileDownLoad = new File(parent,fileName);
104
105             for(int i=0;i<3;i++){
106                 long start = i*bloack;
107                 long end = (i+1)*bloack-1;
108                 //第三个线程需要包括完最后的数据,否则不完整
109                 if(i==2){
110                     end = count;
111                 }
112
113                 DownLoadRunnable runnable =
114                         new DownLoadRunnable(url,
115                                 fileDownLoad.getAbsolutePath(),
116                                 start,end,handler);
117                 //线程池提交任务
118                 threadPool.execute(runnable);
119             }
120         } catch (MalformedURLException e) {
121             e.printStackTrace();
122         } catch (IOException e) {
123             e.printStackTrace();
124         }
125     }
126
127     //根据URL取出文件名
128     public String getFileName(String url){
129         return url.substring(url.lastIndexOf("/")+1);
130     }
131 }
时间: 2025-01-11 07:45:26

Android 模拟多线程下载的相关文章

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

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

Android版多线程下载器核心代码分享

首先给大家分享多线程下载核心类: 1 package com.example.urltest; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.RandomAccessFile; 6 import java.net.HttpURLConnection; 7 import java.net.MalformedURLException; 8 import java.net.URL; 9 im

Android 之多线程下载原理

在Android之中呢,对于多线程的操作很是平凡,所以对于多线程的理解越深,那么对于自己的程序便能够很好的运行 这也是对于Android开发是一个重要的知识点,那么我们现在来了解多线程的下载原理. android 多线程下载 多线程下载步骤: 1.本地创建一个跟服务器一样的大小一样的文件 临时文件. 2.计算分配几个线程去下载服务器上的资源 每个文件下载的位置. 3.开启线程,每一个线程下载对应的文件. 4.如果所有的线程都把自己的数据下载完成了,服务器上的资源就被下载到本地了 如图所示:(假设

Android之——多线程下载演示样例

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

Android开发--多线程下载加断点续传

文件下载在App应用中也用到很多,一般版本更新时多要用的文件下载来进行处理,以前也有看过很多大神有过该方面的博客,今天我也自己来实践一下,写的一般,还请大家多提意见,共同进步.主要思路: 1.多线程下载: 首先通过下载总线程数来划分文件的下载区域:利用int range = fileSize / threadCount:得到每一段下载量:每一段的位置是i * range到(i + 1) * rang  - 1,注意最后一段的位置是到filesize - 1: 通过Http协议的Range字段实现

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

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

Android中 多线程下载原理

计算每个线程的下载起始终止位置公式如下 文件读写方式4中类型 工程源码目录 package cn.itcast.download; import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class MulThreadDownloader { public stat

android程序----&gt;android多线程下载(二)

上篇我们讲到了android中下载的断点续传问题,今天我们开始学习下载的多线程问题.本次的多线程源码下载:androdi中多线程下载的实现代码.有关断点续传的问题,请参见博客:android程序---->android多线程下载(一) 目录导航 android中多线程下载的思路 android中多线程中的原理说明 android中多线程下载的实现 友情链接 android中多线程下载的思路 一. 多线程下载的步骤说明: 第一步: 我们要获得下载资源的的长度,用http请求中HttpURLConn

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

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