在安卓中,可以直接用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. linux获取精准进程PID之pgrep命令

    pgrep 是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行.在服务器的配置和管理中,这个工具常被应用,简单明了. 用法: #pgrep [选项] [程序名] pgrep [-flvx ...

  2. MM bound 与 Jensen's inequality

    MM bound 与 Jensen's inequality 简森不等式 在使用最大似然估计方法求解模型最优解的时候,如果使用梯度下降(GD or SGD)或者梯度上升(GA or SGA),可能收敛 ...

  3. 【MySQL】mysql出现错误“ Every derived table must have its own alias”

    Every derived table must have its own alias 这句话的意思是说每个派生出来的表都必须有一个自己的别名 一般在多表查询时,会出现此错误. 因为,进行嵌套查询的时 ...

  4. 【struts2】核心概念

    1)FilterDispatcher Struts2的前端控制器,也是Struts2的MVC中的控制器部分.在实际开发中,只需要在web.xml中配置一次即可,如下所示: <filter> ...

  5. C/C++/动态链接库DLL中函数的调用约定与名称修饰

    参见:http://blog.twofei.com/cc/impl/calling-convension.html 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用 ...

  6. 【转】Tesla Model X的车门设计问题

    Tesla Model X的车门设计问题 Tesla即将推出的SUV(Model X),不但继承了以上提到的Model S的各种问题(触摸屏,门把,……),而且还制造了新的问题.Model X具有一个 ...

  7. Swift2.0语言教程之函数嵌套调用形式

    Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还能够调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其它函数:还 ...

  8. Linux shell下30个有趣的命令

    Tips 原文作者:Víctor López Ferrando 原文地址:30 interesting commands for the Linux shell 这些是我收集了多年的Linux she ...

  9. 怎么在eclipse中查到这个类用的是哪个jar的类和Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案

    找到了一个办法,你先按F3,然后点击Change Attached Source..按钮,在弹出的框里有个路径,我的路径是D:/SNFWorkSpace/JAR/~importu9.jar,然后你去引 ...

  10. springboot 项目单元测试

    项目结构如下 1 引入测试的 maven 依赖 <dependency> <groupId>org.springframework.boot</groupId> & ...