在安卓中,可以直接用java的java.net.URL包访问网络下载数据。不同的是,安卓程序需要权限,需要在AndroidManifest.xml文件中声明权限

  1. <!-- 网络权限 -->
  2. <uses-permission android:name="android.permission.INTERNET"/>
  3. <!-- 操作sd卡权限 -->
  4. <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的安装包,在使用网络服务的时候,处理网络请求的代码,不能在主线程中进行,不然安卓会提示错误。

但是,有些组件设置值,他必须是在主线程的循环中,才可以。

  1. Looper loop = Looper.getMainLooper();
  2. handler = new Handler(loop){
  3. @Override
  4. public void handleMessage(Message msg) {
  5. // TODO Auto-generated method stub
  6. super.handleMessage(msg);
  7. switch (msg.what) {
  8. case SETTEXT:
  9. //主线程ui更新text值
  10. text.setText(msg.obj.toString());
  11. break;
  12. }
  13. }
  14. };
  15. download.setOnClickListener(new View.OnClickListener() {
  16. @Override
  17. public void onClick(View arg0) {
  18. //新线程下载
  19. new Thread(new Runnable() {
  20. @Override
  21. public void run() {
  22. //新建一个下载
  23. Download load = new Download(url);
  24. String value = load.downloadAsString();
  25. Message msg = handler.obtainMessage();
  26. msg.obj = value;
  27. msg.what = SETTEXT;
  28. msg.sendToTarget();
  29. }
  30. }).start();
  31. }
  32. });
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类:

  1. package com.example.org.suju.download;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import java.net.HttpURLConnection;
  9. import java.net.URL;
  10. import android.os.Environment;
  11. import android.util.Log;
  12. public class Download {
  13. /** 连接url */
  14. private String urlstr;
  15. /** sd卡目录路径 */
  16. private String sdcard;
  17. /** http连接管理类 */
  18. private HttpURLConnection urlcon;
  19. public Download(String url)
  20. {
  21. this.urlstr = url;
  22. //获取设备sd卡目录
  23. this.sdcard = Environment.getExternalStorageDirectory() + "/";
  24. urlcon = getConnection();
  25. }
  26. /*
  27. * 读取网络文本
  28. */
  29. public String downloadAsString()
  30. {
  31. StringBuilder sb = new StringBuilder();
  32. String temp = null;
  33. try {
  34. InputStream is = urlcon.getInputStream();
  35. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  36. while ((temp = br.readLine()) != null) {
  37. sb.append(temp);
  38. }
  39. br.close();
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. }
  43. return sb.toString();
  44. }
  45. /*
  46. * 获取http连接处理类HttpURLConnection
  47. */
  48. private HttpURLConnection getConnection()
  49. {
  50. URL url;
  51. HttpURLConnection urlcon = null;
  52. try {
  53. url = new URL(urlstr);
  54. urlcon = (HttpURLConnection) url.openConnection();
  55. } catch (Exception e) {
  56. e.printStackTrace();
  57. }
  58. return urlcon;
  59. }
  60. /*
  61. * 获取连接文件长度。
  62. */
  63. public int getLength()
  64. {
  65. return urlcon.getContentLength();
  66. }
  67. /*
  68. * 写文件到sd卡 demo
  69. * 前提需要设置模拟器sd卡容量,否则会引发EACCES异常
  70. * 先创建文件夹,在创建文件
  71. */
  72. public int down2sd(String dir, String filename, downhandler handler)
  73. {
  74. StringBuilder sb = new StringBuilder(sdcard)
  75. .append(dir);
  76. File file = new File(sb.toString());
  77. if (!file.exists()) {
  78. file.mkdirs();
  79. //创建文件夹
  80. Log.d("log", sb.toString());
  81. }
  82. //获取文件全名
  83. sb.append(filename);
  84. file = new File(sb.toString());
  85. FileOutputStream fos = null;
  86. try {
  87. InputStream is = urlcon.getInputStream();
  88. //创建文件
  89. file.createNewFile();
  90. fos = new FileOutputStream(file);
  91. byte[] buf = new byte[1024];
  92. while ((is.read(buf)) != -1) {
  93. fos.write(buf);
  94. //同步更新数据
  95. handler.setSize(buf.length);
  96. }
  97. is.close();
  98. } catch (Exception e) {
  99. return 0;
  100. } finally {
  101. try {
  102. fos.close();
  103. } catch (IOException e) {
  104. e.printStackTrace();
  105. }
  106. }
  107. return 1;
  108. }
  109. /*
  110. * 内部回调接口类
  111. */
  112. public abstract class downhandler
  113. {
  114. public abstract void setSize(int size);
  115. }
  116. }
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:

用一个线程循环处理网络下载,并使用下载类回调函数,发送处理消息给主线程消息处理方法,同步更新滚动条值。

  1. @Override
  2. rotected void onCreate(Bundle savedInstanceState) {
  3. // TODO Auto-generated method stub
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.download);
  6. text = (TextView) findViewById(R.id.label);
  7. load = (ProgressBar) findViewById(R.id.load);
  8. //获取传递的Intent的Bundle的url键值
  9. final String url = getIntent().getExtras().getString("url");
  10. final Handler handler = new Handler(){
  11. @Override
  12. public void handleMessage(Message msg) {
  13. super.handleMessage(msg);
  14. //这里就一条消息
  15. int pro = load.getProgress() + msg.arg1;
  16. load.setProgress(pro);
  17. text.setText(Integer.toString(pro));
  18. if (pro >= load.getMax()) {
  19. finish();   //结束下载进度框
  20. }
  21. }
  22. };
        @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(); //结束下载进度框
}
}
};
  1. new Thread(new Runnable() {
  2. @Override
  3. public void run() {
  4. //另起线程执行下载,安卓最新sdk规范,网络操作不能再主线程。
  5. Download l = new Download(url);
  6. load.setMax(l.getLength());
  7. /**
  8. * 下载文件到sd卡,虚拟设备必须要开始设置sd卡容量
  9. * downhandler是Download的内部类,作为回调接口实时显示下载数据
  10. */
  11. int status = l.down2sd("downtemp/", "1.ddd", l.new downhandler() {
  12. @Override
  13. public void setSize(int size) {
  14. Message msg = handler.obtainMessage();
  15. msg.arg1 = size;
  16. msg.sendToTarget();
  17. Log.d("log", Integer.toString(size));
  18. }
  19. });
  20. //log输出
  21. Log.d("log", Integer.toString(status));
  22. }
  23. }).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。

  1. <activity
  2. android:name="com.example.org.suju.download.DownloadActivity"
  3. android:theme="@android:style/Theme.Dialog"
  4. ></activity>
<activity
android:name="com.example.org.suju.download.DownloadActivity"
android:theme="@android:style/Theme.Dialog"
></activity>

使用一个按钮启动下载对话框Activity,并传递数据

  1. down2sd.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View arg0) {
  4. Intent intent = new Intent();
  5. intent.setClass(MainActivity.this, DownloadActivity.class);
  6. Bundle bundle = new Bundle();
  7. bundle.putString("url", urlstr.getText().toString());
  8. intent.putExtras(bundle);
  9. startActivity(intent);
  10. }
  11. });
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 下载的更多相关文章

  1. android sdk下载

    android sdk下载 所有的离线包都有 http://mirrors.neusoft.edu.cn/android/repository/

  2. Android Studio下载及使用教程(转载)

    (一)下载及相关问题解决: Android Studio 下载地址,目前最新可下载地址,尽量使用下载工具. Android Studio正式发布,给Android开发者带来了不小的惊喜.但是下载地址却 ...

  3. 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

    1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...

  4. android程序---->android多线程下载(一)

    多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务,可以使任务的执行速度变快.多线程的任务下载时常都会使用得到断点续传下载,就是我们在一次下载未结束时退出下载,第二次下载时会接着第一次 ...

  5. Android Studio下载与安装

    Android Studio下载与安装 1 2 3 4 5 分步阅读 百度经验:jingyan.baidu.com 自从Google宣布Android Studio将取代Eclipse,正式成为官方集 ...

  6. 曲线救国,解决Mac系统下,Android sdk下载失败的问题

    Mac下翻_墙的问题 话说GFW屏蔽谷歌已经有一阵子了,最近打算在Mac系统下折腾个Android应用,备好了IDE,只欠SDK,无奈下载时因为GFW的缘故,总是失败,我心痛哉! 由于本人偏爱Mac系 ...

  7. Android异步下载图片并且缓存图片到本地

    Android异步下载图片并且缓存图片到本地 在Android开发中我们经常有这样的需求,从服务器上下载xml或者JSON类型的数据,其中包括一些图片资源,本demo模拟了这个需求,从网络上加载XML ...

  8. Android源代码下载方法具体解释

    作者:张星 相信非常多下载过内核的人都对这个非常熟悉 git clone git://android.git.kernel.org/kernel/common.git kernel 可是这是在曾经,如 ...

  9. Android Studio下载及离线升级方法

    由于众所周知的原因,android官网无法访问,所以我们要用到翻.墙.工具,我用的是自.由.门,大家自行搜索下载. android studio下载地址: https://dl.google.com/ ...

  10. picasso_强大的Android图片下载缓存库

    tag: android pic skill date: 2016/07/09 title: picasso-强大的Android图片下载缓存库 [本文转载自:泡在网上的日子 参考:http://bl ...

随机推荐

  1. 设置mysql group_concat长度

    #在MySQL配置文件(my.ini)中默认无该配置项,使用默认值时,值为1024,可在客户端执行下列语句修改: #SET GLOBAL group_concat_max_len = 1024; #该 ...

  2. [转载]Ubuntu下Git服务器安装与配置

    原文地址:Ubuntu下Git服务器安装与配置作者:F民抄 1. 安装 1.1 安装Git-Core: sudo apt-get install git-core 1.2 安装 Gitosis sud ...

  3. linux 常见音乐、视频播放器简介

    2007-1-15 10:00:22     常见音乐播放器     xmms一族     xmms全称是X Multimedia System,这个经典的播放器可能是每个linux的使用者或多或少都 ...

  4. 事务的四个属性ACID

    事务四大特征:原子性,一致性,隔离性和持久性. 1. 原子性(Atomicity) 一个原子事务要么完整执行,要么干脆不执行.这意味着,工作单元中的每项任务都必须正确执行.如果有任一任务执行失败,则整 ...

  5. Lua队列问题

    今天看到Lua程序设计第11章了,表示按照书中的例子打出来,但是不知道正确写用: List = {} function List.new () return {first = 0, last = -1 ...

  6. vim学习笔记(一)—— vim安装方法

    一.完全卸载vim的方法 sudo apt-get remove --purge vim (--purge 是完全删除,会连配置文件一起删除) 二.Vim前言——————“世界上只有三种编辑器,EMA ...

  7. webpack window dev-server配置

    1.安装webpack dev-server npm install --save-dev webpack webpack-dev-server 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  8. itunes Connect 未能创建 App 图标

    之前用的是chrome浏览器提交了app和app图标都是没问题的,可今天一直提交一直没成功,也是符合apple要求格式和大小的,郁闷.后来想了想换个浏览器试试,用了mac自带的safari浏览器后居然 ...

  9. mysql密码过期问题

    密码自动过期是mysql 5.7.4引入的新功能.由参数default_password_lifetime控制.从5.7.4到5.7.10,默认是360天.设置为0,即不开启密码过期设置. 取消某个用 ...

  10. js获取日期:昨天今天和明天、后天

    <html> <head> <meta http-equiv="Content-Type" content="textml; charset ...