Android Http 下载
在安卓中,可以直接用java的java.net.URL包访问网络下载数据。不同的是,安卓程序需要权限,需要在AndroidManifest.xml文件中声明权限
- <!-- 网络权限 -->
- <uses-permission android:name="android.permission.INTERNET"/>
- <!-- 操作sd卡权限 -->
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- <!-- 网络权限 -->
- <uses-permission android:name="android.permission.INTERNET"/>
- <!-- 操作sd卡权限 -->
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
不过有个需要注意的是,我使用的是最新的adt安卓开发集成eclipse的安装包,在使用网络服务的时候,处理网络请求的代码,不能在主线程中进行,不然安卓会提示错误。
但是,有些组件设置值,他必须是在主线程的循环中,才可以。
- Looper loop = Looper.getMainLooper();
- handler = new Handler(loop){
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- switch (msg.what) {
- case SETTEXT:
- //主线程ui更新text值
- text.setText(msg.obj.toString());
- break;
- }
- }
- };
- download.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View arg0) {
- //新线程下载
- new Thread(new Runnable() {
- @Override
- public void run() {
- //新建一个下载
- Download load = new Download(url);
- String value = load.downloadAsString();
- Message msg = handler.obtainMessage();
- msg.obj = value;
- msg.what = SETTEXT;
- msg.sendToTarget();
- }
- }).start();
- }
- });
- Looper loop = Looper.getMainLooper();
- handler = new Handler(loop){
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- switch (msg.what) {
- case SETTEXT:
- //主线程ui更新text值
- text.setText(msg.obj.toString());
- break;
- }
- }
- };
- download.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View arg0) {
- //新线程下载
- new Thread(new Runnable() {
- @Override
- public void run() {
- //新建一个下载
- Download load = new Download(url);
- String value = load.downloadAsString();
- Message msg = handler.obtainMessage();
- msg.obj = value;
- msg.what = SETTEXT;
- msg.sendToTarget();
- }
- }).start();
- }
- });
Download类:
- package com.example.org.suju.download;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import android.os.Environment;
- import android.util.Log;
- public class Download {
- /** 连接url */
- private String urlstr;
- /** sd卡目录路径 */
- private String sdcard;
- /** http连接管理类 */
- private HttpURLConnection urlcon;
- public Download(String url)
- {
- this.urlstr = url;
- //获取设备sd卡目录
- this.sdcard = Environment.getExternalStorageDirectory() + "/";
- urlcon = getConnection();
- }
- /*
- * 读取网络文本
- */
- public String downloadAsString()
- {
- StringBuilder sb = new StringBuilder();
- String temp = null;
- try {
- InputStream is = urlcon.getInputStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- while ((temp = br.readLine()) != null) {
- sb.append(temp);
- }
- br.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return sb.toString();
- }
- /*
- * 获取http连接处理类HttpURLConnection
- */
- private HttpURLConnection getConnection()
- {
- URL url;
- HttpURLConnection urlcon = null;
- try {
- url = new URL(urlstr);
- urlcon = (HttpURLConnection) url.openConnection();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return urlcon;
- }
- /*
- * 获取连接文件长度。
- */
- public int getLength()
- {
- return urlcon.getContentLength();
- }
- /*
- * 写文件到sd卡 demo
- * 前提需要设置模拟器sd卡容量,否则会引发EACCES异常
- * 先创建文件夹,在创建文件
- */
- public int down2sd(String dir, String filename, downhandler handler)
- {
- StringBuilder sb = new StringBuilder(sdcard)
- .append(dir);
- File file = new File(sb.toString());
- if (!file.exists()) {
- file.mkdirs();
- //创建文件夹
- Log.d("log", sb.toString());
- }
- //获取文件全名
- sb.append(filename);
- file = new File(sb.toString());
- FileOutputStream fos = null;
- try {
- InputStream is = urlcon.getInputStream();
- //创建文件
- file.createNewFile();
- fos = new FileOutputStream(file);
- byte[] buf = new byte[1024];
- while ((is.read(buf)) != -1) {
- fos.write(buf);
- //同步更新数据
- handler.setSize(buf.length);
- }
- is.close();
- } catch (Exception e) {
- return 0;
- } finally {
- try {
- fos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return 1;
- }
- /*
- * 内部回调接口类
- */
- public abstract class downhandler
- {
- public abstract void setSize(int size);
- }
- }
- package com.example.org.suju.download;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import android.os.Environment;
- import android.util.Log;
- public class Download {
- /** 连接url */
- private String urlstr;
- /** sd卡目录路径 */
- private String sdcard;
- /** http连接管理类 */
- private HttpURLConnection urlcon;
- public Download(String url)
- {
- this.urlstr = url;
- //获取设备sd卡目录
- this.sdcard = Environment.getExternalStorageDirectory() + "/";
- urlcon = getConnection();
- }
- /*
- * 读取网络文本
- */
- public String downloadAsString()
- {
- StringBuilder sb = new StringBuilder();
- String temp = null;
- try {
- InputStream is = urlcon.getInputStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- while ((temp = br.readLine()) != null) {
- sb.append(temp);
- }
- br.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return sb.toString();
- }
- /*
- * 获取http连接处理类HttpURLConnection
- */
- private HttpURLConnection getConnection()
- {
- URL url;
- HttpURLConnection urlcon = null;
- try {
- url = new URL(urlstr);
- urlcon = (HttpURLConnection) url.openConnection();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return urlcon;
- }
- /*
- * 获取连接文件长度。
- */
- public int getLength()
- {
- return urlcon.getContentLength();
- }
- /*
- * 写文件到sd卡 demo
- * 前提需要设置模拟器sd卡容量,否则会引发EACCES异常
- * 先创建文件夹,在创建文件
- */
- public int down2sd(String dir, String filename, downhandler handler)
- {
- StringBuilder sb = new StringBuilder(sdcard)
- .append(dir);
- File file = new File(sb.toString());
- if (!file.exists()) {
- file.mkdirs();
- //创建文件夹
- Log.d("log", sb.toString());
- }
- //获取文件全名
- sb.append(filename);
- file = new File(sb.toString());
- FileOutputStream fos = null;
- try {
- InputStream is = urlcon.getInputStream();
- //创建文件
- file.createNewFile();
- fos = new FileOutputStream(file);
- byte[] buf = new byte[1024];
- while ((is.read(buf)) != -1) {
- fos.write(buf);
- //同步更新数据
- handler.setSize(buf.length);
- }
- is.close();
- } catch (Exception e) {
- return 0;
- } finally {
- try {
- fos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return 1;
- }
- /*
- * 内部回调接口类
- */
- public abstract class downhandler
- {
- public abstract void setSize(int size);
- }
- }
线程下载提示Activity:
用一个线程循环处理网络下载,并使用下载类回调函数,发送处理消息给主线程消息处理方法,同步更新滚动条值。
- @Override
- rotected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.download);
- text = (TextView) findViewById(R.id.label);
- load = (ProgressBar) findViewById(R.id.load);
- //获取传递的Intent的Bundle的url键值
- final String url = getIntent().getExtras().getString("url");
- final Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- //这里就一条消息
- int pro = load.getProgress() + msg.arg1;
- load.setProgress(pro);
- text.setText(Integer.toString(pro));
- if (pro >= load.getMax()) {
- finish(); //结束下载进度框
- }
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.download);
- text = (TextView) findViewById(R.id.label);
- load = (ProgressBar) findViewById(R.id.load);
- //获取传递的Intent的Bundle的url键值
- final String url = getIntent().getExtras().getString("url");
- final Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- //这里就一条消息
- int pro = load.getProgress() + msg.arg1;
- load.setProgress(pro);
- text.setText(Integer.toString(pro));
- if (pro >= load.getMax()) {
- finish(); //结束下载进度框
- }
- }
- };
- new Thread(new Runnable() {
- @Override
- public void run() {
- //另起线程执行下载,安卓最新sdk规范,网络操作不能再主线程。
- Download l = new Download(url);
- load.setMax(l.getLength());
- /**
- * 下载文件到sd卡,虚拟设备必须要开始设置sd卡容量
- * downhandler是Download的内部类,作为回调接口实时显示下载数据
- */
- int status = l.down2sd("downtemp/", "1.ddd", l.new downhandler() {
- @Override
- public void setSize(int size) {
- Message msg = handler.obtainMessage();
- msg.arg1 = size;
- msg.sendToTarget();
- Log.d("log", Integer.toString(size));
- }
- });
- //log输出
- Log.d("log", Integer.toString(status));
- }
- }).start();
- new Thread(new Runnable() {
- @Override
- public void run() {
- //另起线程执行下载,安卓最新sdk规范,网络操作不能再主线程。
- Download l = new Download(url);
- load.setMax(l.getLength());
- /**
- * 下载文件到sd卡,虚拟设备必须要开始设置sd卡容量
- * downhandler是Download的内部类,作为回调接口实时显示下载数据
- */
- int status = l.down2sd("downtemp/", "1.ddd", l.new downhandler() {
- @Override
- public void setSize(int size) {
- Message msg = handler.obtainMessage();
- msg.arg1 = size;
- msg.sendToTarget();
- Log.d("log", Integer.toString(size));
- }
- });
- //log输出
- Log.d("log", Integer.toString(status));
- }
- }).start();
- }
对话框模式的Activity需要设置一个属性android:theme。
- <activity
- android:name="com.example.org.suju.download.DownloadActivity"
- android:theme="@android:style/Theme.Dialog"
- ></activity>
- <activity
- android:name="com.example.org.suju.download.DownloadActivity"
- android:theme="@android:style/Theme.Dialog"
- ></activity>
使用一个按钮启动下载对话框Activity,并传递数据
- down2sd.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View arg0) {
- Intent intent = new Intent();
- intent.setClass(MainActivity.this, DownloadActivity.class);
- Bundle bundle = new Bundle();
- bundle.putString("url", urlstr.getText().toString());
- intent.putExtras(bundle);
- startActivity(intent);
- }
- });
- down2sd.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View arg0) {
- Intent intent = new Intent();
- intent.setClass(MainActivity.this, DownloadActivity.class);
- Bundle bundle = new Bundle();
- bundle.putString("url", urlstr.getText().toString());
- intent.putExtras(bundle);
- startActivity(intent);
- }
- });
版权声明:本文为博主原创文章,未经博主允许不得转载。
Android Http 下载的更多相关文章
- android sdk下载
android sdk下载 所有的离线包都有 http://mirrors.neusoft.edu.cn/android/repository/
- Android Studio下载及使用教程(转载)
(一)下载及相关问题解决: Android Studio 下载地址,目前最新可下载地址,尽量使用下载工具. Android Studio正式发布,给Android开发者带来了不小的惊喜.但是下载地址却 ...
- 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)
1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...
- android程序---->android多线程下载(一)
多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务,可以使任务的执行速度变快.多线程的任务下载时常都会使用得到断点续传下载,就是我们在一次下载未结束时退出下载,第二次下载时会接着第一次 ...
- Android Studio下载与安装
Android Studio下载与安装 1 2 3 4 5 分步阅读 百度经验:jingyan.baidu.com 自从Google宣布Android Studio将取代Eclipse,正式成为官方集 ...
- 曲线救国,解决Mac系统下,Android sdk下载失败的问题
Mac下翻_墙的问题 话说GFW屏蔽谷歌已经有一阵子了,最近打算在Mac系统下折腾个Android应用,备好了IDE,只欠SDK,无奈下载时因为GFW的缘故,总是失败,我心痛哉! 由于本人偏爱Mac系 ...
- Android异步下载图片并且缓存图片到本地
Android异步下载图片并且缓存图片到本地 在Android开发中我们经常有这样的需求,从服务器上下载xml或者JSON类型的数据,其中包括一些图片资源,本demo模拟了这个需求,从网络上加载XML ...
- Android源代码下载方法具体解释
作者:张星 相信非常多下载过内核的人都对这个非常熟悉 git clone git://android.git.kernel.org/kernel/common.git kernel 可是这是在曾经,如 ...
- Android Studio下载及离线升级方法
由于众所周知的原因,android官网无法访问,所以我们要用到翻.墙.工具,我用的是自.由.门,大家自行搜索下载. android studio下载地址: https://dl.google.com/ ...
- picasso_强大的Android图片下载缓存库
tag: android pic skill date: 2016/07/09 title: picasso-强大的Android图片下载缓存库 [本文转载自:泡在网上的日子 参考:http://bl ...
随机推荐
- iOS SnapKit自动布局使用详解(Swift版Masonry)
对于自动布局: 我们在 StoryBoard 中可以使用约束实现,简单明了,但如果用纯代码来设置约束就很麻烦了 OC里面,我们常用的有Masonry,SDAutoLayout Swift里,我们有Sn ...
- 完善_IO, _IOR, _IOW, _IOWR 宏的用法与解析
_IO, _IOR, _IOW, _IOWR 宏的用法与解析 原文地址:http://www.eefocus.com/ayayayaya/blog/12-03/245777_20cdd.html 作 ...
- 构建高性能数据库缓存之redis(二)
一.概述 在构建高性能数据库缓存之redis(一)这篇文档中,阐述了Redis数据库(key/value)的特点.功能以及简单的配置过程,相信阅读过这篇文档的朋友,对Redis数据库会有一点的了解,此 ...
- >/dev/null 2>&1的含义
转帖:http://www.cnblogs.com/dkblog/archive/2009/07/31/1980722.html os.system("/etc/init.d/winbind ...
- 如何用STAF进行自动化测试分布式运行
本文的目的在于引导读者去了解STAF及如何调用其接口去实现自动化测试的分布式动行. 提到分布式运行,很多人想到了Jenkins,Jenkins里面有个node插件,可以去分派任务给slave,Jenk ...
- fedora装机运行第一脚本
博主原创: #!/bin/bash echo "更换源&更新源......" yum install wget -y yum install yum-fastestmirr ...
- 【SqlServer】在SqlServer中把数据导入导出为Excel文件
这里笔者介绍利用SqlServer数据库操作EXECEL文件. 1.将Excel表中的数据导入为SqlServer数据库 把Excel表中的数据导入为SqlServer数据库中的数据. 新建一个Exc ...
- 【MyBatis】解析MyBatis传入参数的问题
一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...
- 【JQuery】jQuery中的常用方法小结
1.层级选择器 后代选择器 "父元素 后代元素" 比如:$("div p") 选取div元素下所有的p元素 子元素选择器 "父元 ...
- 【C语言】字符串常量与指针