当前位置:操作系统 > 安卓/Android >>

Android的网络应用-使用HttpURLConnection

Android的网络应用-使用HttpURLConnection

实例:多线程下载

实现多线程的步骤:

1.创建URL对象。

2.获取指定URL对象所指向资源的大小。

3.在本地磁盘上创建一个与网络资源相同大小的空文件。

4.计算每条线程应该下载网络资源的哪个部分(从哪个字节开始,到哪个字节结束)

5.依次创建,启动多线程来下载网络资源的指定部分

 

创建项目:MultiThreadDown

程序清单

下载工具类:DownUtil.java

Activity:MultiThreadDown.java

 

项目运行效果:

 \

 

[java] 
package org.wwj.net; 
 
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) 
    { 
        this.path = path; 
        this.threadNum = threadNum; 
        // 初始化threads数组  
        threads = new DownloadThread[threadNum]; 
        this.targetFile = targetFile; 
    } 
 
    public void download() throws Exception 
    { 
        URL url = new URL(path); 
        HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
        conn.setConnectTimeout(5 * 1000); 
        conn.setRequestMethod("GET"); 
        conn.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, */*"); 
        conn.setRequestProperty("Accept-Language", "zh-CN"); 
        conn.setRequestProperty("Charset", "UTF-8"); 
        conn.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)"); 
        conn.setRequestProperty("Connection", "Keep-Alive"); 
        // 得到文件大小  
        fileSize = conn.getContentLength(); 
        conn.disconnect(); 
        int currentPartSize = fileSize / threadNum + 1; 
        RandomAccessFile file = new RandomAccessFile(targetFile, "rw"); 
        // 设置本地文件的大小  
        file.setLength(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; 
 补充:移动开发 , Android ,

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,