Android上Java网络资源访问(二)使用HttpURLConnection多线程下载

Android-使用HttpURLConnection实现多线程下载 使用HttpURLConnection实现多线程下载这个小程序是根据《疯狂Android讲义》(第三版)第13章 Android网络应用,13.3节 使用HTTP访问网络 扩展而来。 使用多线程下载文件可以更快地完成下载任务,因为客户端启动多条线程进行下载就意味着服务器也需要为该客户端提供相应的服务。假设服务器同时最多服务100个用户,在服务器中一个线程对应一个用户,100条线程在计算机内并发 阅读详情

对网络访问不太了解的新手,可以先看一下上一篇文章对URL的简单介绍:Android上Java网络资源访问(一)使用URL类访问

1.简介 

HttpURLConnection继承于URLConnection,可以访问指定网站,HttpURLConnection通过对URLConnection的封装,使开发者在使用的过程中能够更加的方便;

URLConnection类可以使用上篇文章介绍的URL类获取,方法如下:

URLConnection connection = realUrl.openConnection();

URLConnection有多种请求方式:

摘抄如下:

Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

具体参考文章:浅谈HTTP中Get与Post的区别
但是虽然URLConnection有多种交互方式,但是我们主要使用GET和POST这两种方式;

GET与POST请求。二者的区别主要在于:
a:) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,
b:) post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。

2. 多线程下载实例

该实例使用android应用开发,编写一个多线程下载的工具类:DownUtil,在一个界面中,一个输入框输入下载文件的url地址,一个输入框设置下载的路径,一个button响应下载,一个进度条显示下载的进度;

具体代码如下:

xml的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.anana.sockettest.DownActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:text="要下载的资源的url:"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="2dp"/>

    <EditText
        android:id="@+id/url"
        android:layout_width="356dp"
        android:layout_height="47dp"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/textView"
        android:layout_marginTop="12dp"
        android:text="http://m.down.sandai.net/MobileThunder/Android_5.44.2.1966/thunder-5.44.2.5060-stable-release-OfficialSite_XunLeiProductCenter.apk"
        tools:layout_editor_absoluteX="2dp"
        tools:layout_editor_absoluteY="32dp"/>

    <EditText
        android:id="@+id/target"
        android:layout_width="222dp"
        android:layout_height="25dp"
        android:layout_alignStart="@+id/download"
        android:layout_below="@+id/textView2"
        android:layout_marginTop="25dp"
        android:text="/mnt/sdcard/"
        tools:layout_editor_absoluteX="16dp"
        tools:layout_editor_absoluteY="117dp"
        android:layout_above="@+id/download"/>

    <Button
        android:id="@+id/download"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="19dp"
        android:text="下载"
        tools:layout_editor_absoluteX="16dp"
        tools:layout_editor_absoluteY="138dp"
        android:layout_above="@+id/downbar"
        android:layout_alignParentStart="true"/>

    <ProgressBar
        android:id="@+id/downbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="270dp"
        android:layout_height="18dp"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true"
        tools:layout_editor_absoluteX="16dp"
        tools:layout_editor_absoluteY="204dp"/>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignEnd="@+id/download"
        android:layout_alignStart="@+id/downbar"
        android:layout_below="@+id/url"
        android:layout_marginTop="18dp"
        android:text="目标文件:"/>
</RelativeLayout>
activity主应用代码部分:

package com.anana.sockettest;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;

import com.anana.sockettest.util.DownUtil;

import java.util.Timer;
import java.util.TimerTask;

public class DownActivity extends AppCompatActivity
{

    private EditText url, target;
    private Button download;
    private ProgressBar bar;
    private Handler handler;
    private int mDownStatu;
    private DownUtil downUtil;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_down);

        url = (EditText) findViewById(R.id.url);
        target = (EditText) findViewById(R.id.target);
        download = (Button) findViewById(R.id.download);
        bar = (ProgressBar) findViewById(R.id.downbar);

        handler = new Handler()
        {
            @Override
            public void handleMessage(Message msg)
            {
                if (msg.what == 33)
                {
                    System.out.println("mDownStatu:"+mDownStatu);
                    bar.setProgress(mDownStatu);
                }
                super.handleMessage(msg);
            }
        };

        download.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                downUtil = new DownUtil(url.getText().toString(), target.getText().toString(), 5);
                new Thread()
                {
                    @Override
                    public void run()
                    {
                        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();
                                mDownStatu = (int) (completeRate * 100);
                                handler.sendEmptyMessage(33);
                                if (mDownStatu >= 100)
                                {
                                    timer.cancel();
                                }

                            }
                        }, 0, 1000);
                    }
                }.start();
            }
        });

    }
}

DownUtil类的编写,核心部分:

package com.anana.sockettest.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * Created by wolfboyjiang on 2017/8/31.
 */

public class DownUtil
{
    private String path;
    private String targetFile;
    private int threadnum;
    private int fileSize;
    private DownThread[] threads;

    public DownUtil(String path, String targetFile, int threadnum)
    {
        this.path = path;
        this.targetFile = targetFile;
        this.threadnum = threadnum;
        threads = new DownThread[threadnum];
    }

    public void download() throws Exception
    {
        System.out.println("download start ,url:"+path);
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        //设置通用的请求属性
        conn.setRequestProperty("Accept", "*/*");
        conn.setRequestProperty("Accept-Language", "UTF-8");
        conn.setRequestProperty("Connection", "Keep-Alive");
//        conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT
// 5.1; SV1)");
        fileSize = conn.getContentLength();
        conn.disconnect();
        int currentPartSize = fileSize / threadnum + 1;
        System.out.println("currentPartSize:"+currentPartSize+",currentPartSize:"+currentPartSize);
        RandomAccessFile file = new RandomAccessFile(targetFile, "rw");
        file.setLength(fileSize);
        file.close();
        for (int i = 0; i < threadnum; i++)
        {
            int startPos = i * currentPartSize;
            RandomAccessFile currentPart = new RandomAccessFile(targetFile, "rw");
            currentPart.seek(startPos);
            threads[i] = new DownThread(startPos, currentPartSize, currentPart);
            threads[i].start();

        }
    }

    public double getCompleteRate()
    {
        int sumSize = 0;
        for (int i = 0; i < threadnum; i++)
        {
            sumSize += threads[i].length;
        }
        System.out.println("fileSize:"+fileSize+",sumSize:"+sumSize);
        return sumSize * 1.0 / fileSize;
    }

    private class DownThread extends Thread
    {
        private int startPos = 0;
        private int currentPartSize;
        private RandomAccessFile currentpart;
        public int length = 0;

        public DownThread(int startPos, int currentPartSize, RandomAccessFile currentpart)
        {
            this.startPos = startPos;
            this.currentPartSize = currentPartSize;
            this.currentpart = currentpart;
        }

        @Override
        public void run()
        {
            try
            {
                URL url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(5000);
                conn.setRequestMethod("GET");
                //设置通用的请求属性
                conn.setRequestProperty("Accept", "*/*");
                conn.setRequestProperty("Accept-Language", "UTF-8");
                conn.setRequestProperty("Connection", "Keep-Alive");

                InputStream in = conn.getInputStream();
                skipFully(in,this.startPos);

                byte[] buffer = new byte[1024];
                int hasRead = 0;
                while (length < currentPartSize && (hasRead = in.read(buffer)) > 0)
                {
                    currentpart.write(buffer,0,hasRead);
                    length += hasRead;
                }
                currentpart.close();
                in.close();

            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }


    }

    public static void skipFully(InputStream in, long bytes) throws IOException
    {
        long remainning = bytes;
        long len = 0;
        while (remainning > 0)
        {
            len = in.skip(remainning);
            remainning -= len;
        }
    }
}




Android网络资源获取实战演示 超文本传输协议(HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是互联网上应用最广泛的协议之一,用于从服务器传输超文本到本地浏览器。HTTP协议是一个基于请求/响应的模型,工作在TCP/IP协议之上。它定义了客户端和服务器之间交互的消息格式。基本的HTTP操作包含GET和POST两种请求方法。GET:从指定的资源请求数据。POST:向指定的资源提交要被处理的数据。 阅读详情

相关推荐

网络请求----HttpURLConnection的get,post和图片加载

HttpURLConnection的get,post和图片加载

Android HTTP客户端:GET,POST,下载,上传,分段请求

通常,Android应用程序必须与远程服务器交换信息。 最简单的方法是使用HTTP协议作为基础来传输信息。 HTTP协议在许多情况下非常有用,例如从远程服务器下载图像或将一些二进制数据上传到服务器。 Android应用执行GET或POST请求以发送数据。 在本文中,我们要分析如何使用HttpURLConnection与远程服务器进行通信。 我们将涵盖三个主要主题: GET和POST请求...

563

基于Multisim的智能交通灯控制系统仿真与实现(含动态闪烁功能)

本文详细介绍了基于Multisim的智能交通灯控制系统仿真与实现,重点解析了动态闪烁功能的电路设计。通过555定时器、74LS192计数器和JK触发器等核心模块,实现了主干道与支干道的交替通行及黄灯1Hz闪烁功能,为交通灯控制系统设计提供了完整的仿真方案。

weixin_29174013的博客 425

Android HTTP访问的两种方式(HttpClient和HttpURLConnection)

Android HTTP访问的两种方式(HttpClient和HttpURLConnection)

Crazy程序猿 5404

电商项目功能简述

1.电商行业的技术特点 1.技术性 2.技术范围广 3.分布式 4.高并发,集群,负载均衡,高可用 5.海量数据 6.业务复杂 7.系统安全 2.电商行业的模式 B2B:企业到企业,商家到商家.代表:阿里巴巴 B2C:商家到客户.代表:京东.淘宝商城 C2C:客户到客户.淘宝集市 O2O:线上到线下 3.B2C电商系统架构功能模块 4.B2C电商系统架构功能描述 后台管理系统:管理商品、订单、类...

weixin_45116848的博客 9744

[计算机头歌]爬虫进阶

【代码】爬虫进阶。

M_inherit的博客 921

Android中Http请求

Android中的网络请求可以分为两种,HttpUrlConnection还有HttpClient,虽然Android中的网络请求框架很多,或许看起来让人觉得眼花缭乱,比如,vollery,Afinal等等。 但是万变不离其宗,这些框架都是根据这两个网络请求多次封装而成的。下面就主要介绍一下HttpUrlConnection和HttpClient。 Http(Hypertext Tra

zhuxiaoxuand的博客 794

基于本机知识库 + 豆包(火山引擎)+ MCP的落地方案

最小 MVP:本地知识库 + Doubao Embedding + 简单检索。工具化:把检索/写入/系统功能通过 MCP 封装。Agent 编排:RAG 流程 + 自检 + 引用输出。这样你就可以快速落地一个基于豆包 + 本机知识库的 MCP Agent。

lpfasd123的博客 1095

Android httpUrlConnection的基本使用

今天,简单讲讲Android HttpUrlConnection的使用。 我在项目里是使用OK HTTP的,但是最近发现使用OK HTTP好多不知道的问题,感觉自己对基本的网络请求不是很好的掌握,所以学习一下基本的网络请求类:HttpUrlConnection。 一,HttpURLconnection的介绍 在Android开发中网络请求是最常用的操作之一, Android SDK中对H...

谢岩的博客 1万+

Y-Branch and a closed y-branch loop

双臂后面的区域,我们将它的双臂使用一个波导进行了连接,使得它本身形成了一个闭合回路,因此,该结构被称作。它们均是用来对经过它们的光束能量进行分割的一种器件。首先,我们知道一点,在光波导层面,今天给大家介绍一下,什么是。

u011699626的博客 629

linux内核学习(八)---摄像头框架移植(上)

本章来开始进行摄像头的移植,同时回顾一下V4L2的整个框架

文艺小少年的博客 113

Android使用HttpURLConnection下载图片

讲到http就必需要了解URI和URL URI (uniform resource identifier)统一资源标志符; URL(uniform resource location )统一资源定位符(或统一资源定位器); 可以理解成URL是URI的子集,URI是一抽象的标识符,URL可以理解成具体的标识符;只要是网络上的资源就能找到唯一的URL。

DMT专栏 6553

【软考高级架构】论文范文12——论生成式AI在软件开发中的应用与挑战

随着生成式AI技术的跨越式发展,以大语言模型为代表的生成式AI正在深刻改变软件开发的传统模式。在代码生成、测试构造、文档编写等环节,生成式AI展现出显著的效率提升潜力,但其应用也面临着代码质量不可控、安全漏洞植入、版权合规等严峻挑战。本文以笔者主导的某大型金融企业智能研发辅助平台建设项目为案例,围绕生成式AI在软件开发中的应用实践与应对挑战的策略展开论述。笔者担任系统架构师,负责平台架构设计、模型选型、质量保障机制及安全防线构建。

qq837993702的博客 275

Android网络编程之使用HTTP访问网络资源

前面介绍了 URLConnection己经可以非常方便地与指定站点交换信息,URLConnection还有一个子类:HttpURLConnection,HttpURLConnection 在 LIRLConnection的基础上做了进一步改进,增加了一些用于操作http资源的便捷方法

fengyuzhengfan的专栏 7491

Midscene.js(2):代码集成 + 桥接模式(Bridge Mode)的使用「喂饭教程」

本文将手把手教你从零开始搭建一个 Node.js 项目,集成 Midscene.js,并利用其桥接模式实现对 Chrome 浏览器的自动化操作。我们将通过具体的实例,来展示 Midscene.js 的便捷性与 AI 能力的结合。

blues_C的博客 1844

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

安卓使用http下载文件

在安卓中,可以直接用java的java.net.URL包访问网络下载数据。不同的是,安卓程序需要权限,需要在AndroidManifest.xml文件中声明权限 不过有个需要注意的是,我使用的是最新的adt安卓开发集成eclipse的安装包,在使用网络服务的时候,处理网络请求的代码,不能在主线程中进行,不然安卓会提示错误。 但是,有些组件设置值,他必须是在主

sujudz的专栏 3万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android移动开发-使用HttpURLConnection实现多线程的下载

实例Demo程序来示范使用HttpURLConnection实现多线程下载。 使用多线程下载文件可以更快完成文件的下载,因为客户端启动多条线程进行下载就意味着服务器也需要为该客户端提供响应的服务。假设服务器同时最多服务100个用户,在服务器中一条线程对应一个用户,100条线程在计算机内并发执行,也就是有CPU划分时间片轮流执行,如果A应用使用了99条线程下载文件,那么相当于占用了99个用户的资源,自然就拥有了较快的下

_彼岸雨敲窗_的博客 1480

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android网络编程之使用HTTP訪问网络资源

使用HTTP訪问网络资源        前面介绍了 URLConnection己经能够很方便地与指定网站交换信息,URLConnection另一个子类:HttpURLConnection,HttpURLConnection 在 LIRLConnection的基础上做了进一步改进,添加了一些用于操作http资源的便捷方法。 1.使用HttpURLConnection       Htt...

weixin_33795806的博客 122

android 文件夹 下载,Android 文件下载(1)

1.项目用到的图片上传的关键方法:哈喽,我又来了,现在是2021年1月19号上午10点35分,给大家分享些文件上传的方法,有需要的继续往下看呦!1.普通单线程下载文件:直接使用URLConnection.openStream()打开网络输入流,然后将流写入到文件中!核心方法:public static void downLoad(String path,Context context)throws...

weixin_34404528的博客 2898

Android的网络应用-使用HttpURLConnection

Android的网络应用-使用HttpURLConnection 实例:多线程下载 实现多线程的步骤: 1.创建URL对象。 2.获取指定URL对象所指向资源的大小。 3.在本地磁盘上创建一个与网络资源相同大小的空文件。 4.计算每条线程应该下载网络资源的哪个部分(从哪个字节开始,到哪个字节结束) 5.依次创建,启动多线程来下载网络资源的指定部分   创建项目:MultiThre

巫山老妖 3416

Android_访问网络一(使用HttpURLConnection访问)

Android 为我们提供了两种访问网络的方式: 一、           HttpURLConnection 二、           HttpClient 当然,除了以上两种,还有其它一些封装好的框架,我们可以很方便的拿来使用,比如android-async-http,以及Google提供的Volley   现在,先来看看如何使用HttpURLConnection对网络资源进行访问

blank 的专栏 879

Java中HttpURLConnection与HttpClient

Java中HttpURLConnection与HttpClient

Rebirth_Love的博客 703

php 安卓下载文件,Android 文件下载(1)

本节引言:又是一个深坑,初学者慎入...本节将从普通的单线程下载 -> 普通多线程下载 ->-> 以及一个很实用的例子:利用Android那只DownloadManager更新apk并覆盖安装的实现代码!好的,这样看上去,本节还是蛮有趣的,开始本节内容!PS:我们把整个完整的多线程断点续传放到下一节中!1.普通单线程下载文件:直接使用URLConnection.openStrea...

weixin_29485887的博客 501
上一篇: Android上Java网络资源访问(一)使用URL类访问
下一篇: Android webview控件(一) 使用webview开发浏览器实例
Anana_JP
博客等级 码龄17年 11粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值