参考疯狂android讲义,重点在于学习1、HttpConnection访问网络2、多线程下载文件的处理

主activity:

package com.example.multithreaddownload;

import java.util.Timer;
import java.util.TimerTask; //import org.crazyit.net.R; import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
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; @SuppressLint("HandlerLeak")
public class MultiThreadDown extends Activity { EditText target;
EditText url;
Button downButton;
ProgressBar bar;
DownUtil downUtil;
private int mDownloadStatus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); url = (EditText) findViewById(R.id.url);
target = (EditText) findViewById(R.id.target);
downButton = (Button) findViewById(R.id.down);
bar = (ProgressBar) findViewById(R.id.bar); final Handler handler = new Handler(){ public void handleMessage(Message msg)
{
if(msg.what == 0x123)
{
bar.setProgress(mDownloadStatus);
}
}
}; downButton.setOnClickListener(new OnClickListener()
{ @Override
public void onClick(View v) {
// downUtil = new DownUtil(url.getText().toString(),
target.getText().toString(),5);
try{
downUtil.download();
}catch(Exception e)
{
e.printStackTrace();
}
//设置定时器
final Timer timer = new Timer();
timer.schedule(new TimerTask()
{ @Override
public void run() {
//
double completeRate = downUtil.getCompleteRate();
mDownloadStatus = (int) (completeRate * 100);
handler.sendEmptyMessage(0x123);
if(mDownloadStatus >= 100)
{
timer.cancel();
}
} }, 0, 100);
} });
} }
package com.example.multithreaddownload;

import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL; public class DownUtil { private String path;
private String targetFile;
private int threadNum;
private DownloadThread[] threads;
private int fileSize; public DownUtil(String path, String targetFile, int threadNum) {
super();
this.path = path;
this.targetFile = targetFile;
//初始化thread数组
threads = new DownloadThread[threadNum];
this.threadNum = threadNum;
} public void download() throws Exception
{
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();//开启http链接
connection.setRequestMethod("GET");//向服务器发送GET请求获取数据
connection.setConnectTimeout(5000);//设置连接超时为5s
// connection.setRequestProperty(
// "Accept",
// "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
// connection.setRequestProperty("Accept-Language", "zh-CN");
// connection.setRequestProperty("Charset", "UTF-8");
// connection.setRequestProperty(
// "User-Agent",
// "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
// connection.setRequestProperty("Connection", "Keep-Alive"); fileSize = connection.getContentLength();//获取文件大小
connection.disconnect();//关闭http连接
int currentPartSize = fileSize / threadNum +1;//按线程数分割后文件块的大小
RandomAccessFile file = new RandomAccessFile(targetFile, "rw");//随机产生本地目标文件 file.setLength(fileSize);//根据fileSize设置本地文件大小
file.close();//关闭文件
for(int i = 0; i < threadNum; i++)
{
//计算每条线程下载的开始位置
int startPos = i * currentPartSize;
//每个线程使用一个RandomAccessFile进行下载
RandomAccessFile currentPart = new RandomAccessFile(targetFile, "rw");
//定位该线程的下载位置
currentPart.seek(startPos);
//创建下载线程
threads[i] = new DownloadThread(startPos, currentPartSize,
currentPart);
threads[i].start();
}
} // 获取下载的完成百分比
public double getCompleteRate()
{
// 统计多条线程已经下载的总大小
int sumSize = 0;
for (int i = 0; i < threadNum; i++)
{
sumSize += threads[i].length;
}
// 返回已经完成的百分比
return sumSize * 1.0 / fileSize;
}
private class DownloadThread extends Thread{
//当前线程下载的位置
private int startPos;
//定义当前线程负责下载的文件大小
private int currentPartSize;
//定义当前线程负责的下载块
private RandomAccessFile currentPart;
//定义该线程已下载的字节数
public int length; public DownloadThread(int startPos, int currentPartSize,
RandomAccessFile currentPart) {
// super();
this.startPos = startPos;
this.currentPartSize = currentPartSize;
this.currentPart = currentPart;
} @Override
public void run() {
super.run();
try{
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
// connection.setReadTimeout(5000);
// connection.setRequestProperty(
// "Accept",
// "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
// connection.setRequestProperty("Accept-Language", "zh-CN");
// connection.setRequestProperty("Charset", "UTF-8"); InputStream in = connection.getInputStream();
//跳过startPos个字节,只下载本线程负责的文件块
in.skip(this.startPos);
byte[] buffer = new byte[1024];
int hasRead = 0;
while((length < currentPartSize) && (hasRead = in.read(buffer)) != -1)
{
currentPart.write(buffer, 0, hasRead);
length += hasRead; }
currentPart.close();
in.close(); }catch(Exception e)
{
e.printStackTrace();
}
} } }

activity_main.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="要下载的资源的URL:"
/>
<EditText
android:id="@+id/url"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="http://www.crazyit.org/attachment.php?aid=1093&amp;k=4ec76aeaa41ee84acf667b420e926783&amp;t=1297311085"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="目标文件:"
/>
<EditText
android:id="@+id/target"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="/mnt/sdcard/a.rar"
/>
<Button
android:id="@+id/down"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/down"
/>
<!-- 定义一个水平进度条,用于显示下载进度 -->
<ProgressBar
android:id="@+id/bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100"
style="@android:style/Widget.ProgressBar.Horizontal"
/>
</LinearLayout>

strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="down">下载</string>
<string name="app_name">多线程下载</string>
<string name="action_settings">Settings</string>
</resources>

AndroidManifest.xml配置文件添加以下权限:

<!-- 在SD卡中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 向SD卡写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 授权访问网络 -->
<uses-permission android:name="android.permission.INTERNET"/>

运行结果:

HttpConnection方式访问网络的更多相关文章

  1. android post 方式 访问网络 实例

    android post 方式 访问网络 实例 因为Android4.0之后对使用网络有特殊要求,已经无法再在主线程中访问网络了,必须使用多线程访问的模式 该实例需要在android配置文件中添加 网 ...

  2. APN APN指一种网络接入技术,是通过手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络。

    apn 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . APN指一种网络接入技术,是通过手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络. 对于手机用户来说,可 ...

  3. Android使用Http协议访问网络——HttpConnection

    套路篇 使用HttpConnection访问网络一般有如下的套路: 1.获取到HttpConnection的实例,new出一个URL对象,并传入目标的网址,然后调用一下openConnection() ...

  4. ADO.NET 连接方式和非链接方式访问数据库

    一.//连接方式访问数据库的主要步骤(利用DataReader对象实现数据库连接模式) 1.创建连接对象(连接字符串) SqlConnection con = new SqlConnection(Co ...

  5. .Net程序员安卓学习之路2:访问网络API

    做应用型的APP肯定是要和网络交互的,那么本节就来实战一把Android访问网络API,还是使用上节的DEMO: 一.准备API: 一般都采用Json作为数据交换格式,目前各种语言均能输出Json串. ...

  6. Android 使用 HTTP 协议访问网络

    正在看<第一行代码>,记录一下使用 HTTP 协议访问网络的内容吧! 在Android发送Http请求有两种方式,HttpURLConnection和HttpClient. 1.使用Htt ...

  7. 在VMware中为CentOS配置静态ip并可访问网络-Windows下的VMware

    在VMware中为CentOS配置静态ip并可访问网络-Windows下的VMware 首先确保虚拟网卡(VMware Network Adapter VMnet8)是开启的,然后在windows的命 ...

  8. Java 网络编程(三) 创建和使用URL访问网络上的资源

    链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951877.html 创建和使用URL访问网络上的资源 URL(Uniform Reso ...

  9. Android访问网络

    Android中访问网络用的是HttpClient的方式,即Apache提供的一个jar包.安卓中继承了改jar包,所以安卓adt中不需要专门import该jar,直接就可以使用. 以下是MainAc ...

随机推荐

  1. MySQL Replication的相关文件

    1.master.info文件 位于slave端的数据目录下,存储slave连接到master的相关信息,如,master主机地址.连接用户.密码.端口.已经获取的日志信息. 复制过程中修改.删除ma ...

  2. @perproty and @synthesize

    .@property 是什么? @perperty 是声明属性的语法,他可以快速方便的为实例变量创建存取器,并允许我们通过点语法使用存取器 [存取器:用于获取和设置实例变量的方法,获取实例变量值得是g ...

  3. SQL中索引的原理

    (一)深入浅出理解索引结构         实际上,您可以把索引理解为一种特殊的目录.微软的SQL   SERVER提供了两种索引:聚集索引(clustered   index,也称聚类索引.簇集索引 ...

  4. CCF真题之ISBN号码

    201312-2 问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上 ...

  5. CentOs5.2中PHP的升级

    最近一个项目中需要使用到PHP5.2的版本,而服务器上使用了官方的yum源进行安装,默认的版本是5.1.6,需要升级.但是因为不是一个非常 正式的服务器环境,所以想通过简单的yum update一下了 ...

  6. 使用UIL(Universal-Image-Loader)异步加载图片

    概要: Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是实现可重复使用的异步图像加载.缓存和显示.所以,如果你的程序里需要这个功能的话,使用它,因为 ...

  7. jquery 实践总结

    Ready事件 对DOM操作之前需要监听页面加载进度,应当在页面加载完成之后再执行DOM编辑操作. $(document).ready(function(){ ... }); 或者 $(functio ...

  8. sqlserver常用调优脚本(转)

    (转)以备不时之需 最耗时的sql declare @n int set @n=500 ; with cte1 as(select a.*,t.*from sys.dm_exec_query_stat ...

  9. V4L2驱动程序框架架构【转】

    本文转载自:http://blog.csdn.net/tommy_wxie/article/details/11728809 1 V4L2简介 video4linux2(V4L2)是Linux内核中关 ...

  10. 【python cookbook】【字符串与文本】11.从字符串中去掉不需要的字符

    问题:在字符串的开始.结尾或中间去掉不需要的字符,比如说空格符 解决方案: 1.字符串开始或结尾处去掉字符:str.strip() 2.从左或从右侧开始执行去除字符:str.lstrip().str. ...