Android Http 下载

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

[html] view plaincopyprint?

  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的安装包,在使用网络服务的时候,处理网络请求的代码,不能在主线程中进行,不然安卓会提示错误。

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

[java] view plaincopyprint?

  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类:

[java] view plaincopyprint?

  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:

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

[java] view plaincopyprint?

  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();	//结束下载进度框
				}
			}
		};

[java] view plaincopyprint?

  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。

[html] view plaincopyprint?

  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,并传递数据

[java] view plaincopyprint?

  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);
	}
});

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-04 22:03:58

Android Http 下载的相关文章

Android 4.4环境搭建——Android SDK下载与安装

学习开发Android应用程序,须要下载安装Android SDK.在Android的官方站点的二级域名http://developer.android.com/index.html中.能够下载到完整版本号的Android SDK,也能够下载到包括开发工具(带ADT插件的Eclipse)的最新版本号的Android SDK.在以下将具体介绍包括开发工具的最新版本号的Android SDK下载与安装的步骤. &  说明:在完整版本号的AndroidSDK中,包括了模拟器.教程.API文档.演示样例

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

1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

使用Android studio下载github上的工程及问题解决 2015-06-03 16:39:44

使用Android studio下载github上的工程及问题解决 2015-06-03 16:39:44 http://blog.chinaunix.net/uid-20771867-id-5066613.html 分类: Android平台 Android studio内置了github的插件,可以直接下载github上的工程,感觉好爽啊.具体怎么做呢?     1.如图所示操作,如果是初次使用会提示输入用户名密码.      2.等android studio读取到你github里面的工程

打开SDK Manager检查Android SDK下载和更新失败的解决方法

[故障描述] 打开SDK Manager检查Android  SDK状况,出现以下情况: Failed to fetch URL https://dl-ssl.google.com/android/repository/addons_list-2.xml, reason: Connection to https://dl-ssl.google.com refused Failed to fetch URL https://dl-ssl.google.com/android/repository/

最新Android Studio下载

此文写给那些无法正常访问http://developer.android.com/网站,又想下载在Android Studio的朋友.因为Android开发者网站设在国外,所以如果你的电脑不翻墙的话是无法正常访问的,为了能让国内的朋友下载到Android Studio,小编这里特意把Android Studio从http://developer.android.com下载下来,然后传到了百度云上.需要的朋友可以从下面的地址下载:链接:http://pan.baidu.com/s/1i3AEanr

Android Studio 下载地址

下载地址:https://developer.android.com/sdk/index.html#download      这个网址可以下载需要的东西,翻墙的话可以给 [email protected] 发一个邮件(内容任意),自动回复里面有FQ软件的下载地址. Android Studio 下载地址,布布扣,bubuko.com

Qt on Android: http下载与Json解析

百度提供有查询 ip 归属地的开放接口,当你在搜索框中输入一个 ip 地址进行搜索,就会打开由 ip138 提供的百度框应用,你可以在框内直接输入 ip 地址查询.我查看了页面请求,提取出查询 ip 归属地的接口,据此使用 Qt 写了个简单的 ip 归属地查询应用.可以在电脑和 Android 手机上运行.这里使用了百度 API ,特此声明,仅可作为演示使用,不能用作商业目的. 版权所有 foruok,转载请注明出处( http://blog.csdn.net/foruok ). 这个例子会用到

毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选

毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.io/picasso/ 我们在上篇OkHttp的时候说过这个Picasso,学名毕加索,是Square公司开源的一个Android图形缓存库,而且使用起来也是非常的简单,只要一行代码就轻松搞定了,你会问,为什么不介绍一下Glide?其实Glide我有时间也是会介绍的,刚好上篇我们用到了Picasso,

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

作者:张星 相信非常多下载过内核的人都对这个非常熟悉 git clone git://android.git.kernel.org/kernel/common.git kernel 可是这是在曾经,如今假设这么运行的话,会显演示样例如以下内容 Initialized empty Git repository in /home/star/working/kernel/.git/ android.git.kernel.org[0: 149.20.4.77]: errno=Connection ref

adt-bundle和android studio下载地址(不定期更新)

因为众所周知的原因,android官网打不开.在这里公布IDE地址,可以用迅雷等软件直接下载. adt-bundle-windows-x86: http://dl.google.com/android/adt/adt-bundle-windows-x86-20140702.zip adt-bundle和android studio下载地址(不定期更新),布布扣,bubuko.com