参考疯狂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. APN APN指一种网络接入技术,是通过手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络。

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

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

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

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

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

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

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

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

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

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

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

  7. Android访问网络

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

  8. Java程序通过代理访问网络

    问题背景 最近工作上有开发爬虫的任务,对目标网站数据进行抓取,由于大部分网站都在国外,无法直接访问,需要通过代理才能登录.爬虫部署的服务器在香港,所以爬虫部署到服务器后,是可以访问目标网站的,但本地开 ...

  9. 虚拟机下克隆3个centos系统并配置IP访问网络(转载)

    此文是保证linux系统能够上网 先查看本机的IP 打开虚拟机,更改虚拟机为桥接方式 在第一个虚拟机上打开终端,在命令行输入setup,选择NETWORK CONFIGRATION 回车后, 配置IP ...

随机推荐

  1. socket通信之eofexception

    方案一: 用read()将不会抛出异常.因为read是block方式的. readInt()抛出异常的原因(我遇到的)是对方在该端口没有消息发送. 方案二: socket的端口被阻塞了 ,也就是我们需 ...

  2. JS正则表达式将url转成json格式

    var url = location.search.substr(1); param = {}; console.log(url); url.replace(/([^?&]+)=([^?&am ...

  3. js中如何获取纯正的undefined?

    1.为什么要获取undefined? 因为undefined在javascript中不是保留字,可以被用户当做变量来赋值,这样如果我们后期需要用到undefined来检测一个变量的话,那么检测的值就不 ...

  4. 强化的单例属性_Effective Java

    Singleton指的是仅仅被实例化一次的类,比如唯一的系统组件等,成为Singleton的类测试起来也比较困难. 常用的方法: 1.公有静态final域+私有构造器 public class Egg ...

  5. 配置Linux自动挂载

    使用mount命令来挂载硬件,在Linux重启后这些挂载信息会丢失,因此对应磁盘这类硬件,需要配置自动挂载来保证系统重启时进行自动挂载. 自动挂载信息保存在文件/etc/fstab文件中 查看该文件的 ...

  6. Mac 下使用sourcetree操作git教程

    SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,同时也是Mercurial和Subversion版本控制系统工具.支持创建.克隆.提交.push.pu ...

  7. BlockingQueue的使用

    本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同 ...

  8. U3D UGUI学习3 - RectTransform

    总的来说整合了NGUI很多零散功能,比如NGUI2.X处理拉伸要额外套脚本,NGUI3.X开始引入新的锚点.再加上依赖BoxCollider使得整个HUD显示非常乱 而UGUI很清晰明了,你也能看清楚 ...

  9. UITableViewCell 自适应高度 ios8特性

    这篇文章介绍了在一个动态数据的 table view 中,cell 根据 text view 内容的输入实时改变 cell 和 table view 的高度.自动计算 cell 高度的功能使用 iOS ...

  10. How Tomcat Works(十四)补充

    在How Tomcat Works(十四)中,本人并没有对javax.servlet.Filter及javax.servlet.FilterChain做详细的描述,本文在这里做一下补充 FilterC ...