码迷,mamicode.com
首页 > 移动开发 > 详细

Android Http 下载

时间:2015-11-03 17:48:37      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:

在安卓中,可以直接用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.           
  16. download.setOnClickListener(new View.OnClickListener() {  
  17.     @Override  
  18.     public void onClick(View arg0) {  
  19.         //新线程下载  
  20.         new Thread(new Runnable() {  
  21.             @Override  
  22.             public void run() {  
  23.                 //新建一个下载  
  24.                 Download load = new Download(url);  
  25.                 String value = load.downloadAsString();  
  26.                 Message msg = handler.obtainMessage();  
  27.                 msg.obj = value;  
  28.                 msg.what = SETTEXT;  
  29.                 msg.sendToTarget();  
  30.             }  
  31.         }).start();  
  32.     }  
  33. });  
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.   
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.io.InputStreamReader;  
  9. import java.net.HttpURLConnection;  
  10. import java.net.URL;  
  11.   
  12. import android.os.Environment;  
  13. import android.util.Log;  
  14.   
  15.   
  16. public class Download {  
  17.     /** 连接url */  
  18.     private String urlstr;  
  19.     /** sd卡目录路径 */  
  20.     private String sdcard;  
  21.     /** http连接管理类 */  
  22.     private HttpURLConnection urlcon;  
  23.       
  24.     public Download(String url)  
  25.     {  
  26.         this.urlstr = url;  
  27.         //获取设备sd卡目录  
  28.         this.sdcard = Environment.getExternalStorageDirectory() + "/";  
  29.         urlcon = getConnection();  
  30.     }  
  31.       
  32.     /* 
  33.      * 读取网络文本 
  34.      */  
  35.     public String downloadAsString()  
  36.     {  
  37.         StringBuilder sb = new StringBuilder();  
  38.         String temp = null;  
  39.         try {  
  40.             InputStream is = urlcon.getInputStream();  
  41.             BufferedReader br = new BufferedReader(new InputStreamReader(is));  
  42.             while ((temp = br.readLine()) != null) {  
  43.                 sb.append(temp);  
  44.             }  
  45.             br.close();  
  46.         } catch (Exception e) {  
  47.             e.printStackTrace();  
  48.         }  
  49.         return sb.toString();  
  50.     }  
  51.       
  52.     /* 
  53.      * 获取http连接处理类HttpURLConnection 
  54.      */  
  55.     private HttpURLConnection getConnection()  
  56.     {  
  57.         URL url;  
  58.         HttpURLConnection urlcon = null;  
  59.         try {  
  60.             url = new URL(urlstr);  
  61.             urlcon = (HttpURLConnection) url.openConnection();  
  62.         } catch (Exception e) {  
  63.             e.printStackTrace();  
  64.         }  
  65.         return urlcon;  
  66.     }  
  67.       
  68.     /* 
  69.      * 获取连接文件长度。 
  70.      */  
  71.     public int getLength()  
  72.     {  
  73.         return urlcon.getContentLength();  
  74.     }  
  75.       
  76.     /* 
  77.      * 写文件到sd卡 demo 
  78.      * 前提需要设置模拟器sd卡容量,否则会引发EACCES异常 
  79.      * 先创建文件夹,在创建文件 
  80.      */  
  81.     public int down2sd(String dir, String filename, downhandler handler)  
  82.     {  
  83.         StringBuilder sb = new StringBuilder(sdcard)  
  84.                             .append(dir);  
  85.         File file = new File(sb.toString());  
  86.         if (!file.exists()) {  
  87.             file.mkdirs();  
  88.             //创建文件夹  
  89.             Log.d("log", sb.toString());  
  90.         }  
  91.         //获取文件全名  
  92.         sb.append(filename);  
  93.         file = new File(sb.toString());  
  94.           
  95.         FileOutputStream fos = null;  
  96.         try {  
  97.             InputStream is = urlcon.getInputStream();  
  98.             //创建文件  
  99.             file.createNewFile();  
  100.             fos = new FileOutputStream(file);  
  101.             byte[] buf = new byte[1024];  
  102.             while ((is.read(buf)) != -1) {  
  103.                 fos.write(buf);  
  104.                 //同步更新数据  
  105.                 handler.setSize(buf.length);  
  106.             }  
  107.             is.close();  
  108.         } catch (Exception e) {  
  109.             return 0;  
  110.         } finally {  
  111.             try {  
  112.                 fos.close();  
  113.             } catch (IOException e) {  
  114.                 e.printStackTrace();  
  115.             }  
  116.         }  
  117.         return 1;  
  118.     }  
  119.       
  120.     /* 
  121.      * 内部回调接口类 
  122.      */  
  123.     public abstract class downhandler  
  124.     {  
  125.         public abstract void setSize(int size);  
  126.     }  
  127. }  
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.   
  7. text = (TextView) findViewById(R.id.label);  
  8. load = (ProgressBar) findViewById(R.id.load);  
  9.   
  10. //获取传递的Intent的Bundle的url键值  
  11. final String url = getIntent().getExtras().getString("url");  
  12.   
  13. final Handler handler = new Handler(){  
  14.     @Override  
  15.     public void handleMessage(Message msg) {  
  16.         super.handleMessage(msg);  
  17.         //这里就一条消息  
  18.         int pro = load.getProgress() + msg.arg1;  
  19.         load.setProgress(pro);  
  20.         text.setText(Integer.toString(pro));  
  21.         if (pro >= load.getMax()) {  
  22.             finish();   //结束下载进度框  
  23.         }  
  24.     }  
  25. };  
        @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.         /** 
  9.          * 下载文件到sd卡,虚拟设备必须要开始设置sd卡容量 
  10.          * downhandler是Download的内部类,作为回调接口实时显示下载数据 
  11.          */  
  12.         int status = l.down2sd("downtemp/", "1.ddd", l.new downhandler() {  
  13.             @Override  
  14.             public void setSize(int size) {  
  15.                 Message msg = handler.obtainMessage();  
  16.                 msg.arg1 = size;  
  17.                 msg.sendToTarget();  
  18.                 Log.d("log", Integer.toString(size));  
  19.             }  
  20.         });  
  21.         //log输出  
  22.         Log.d("log", Integer.toString(status));  
  23.           
  24.     }  
  25. }).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 下载

标签:

原文地址:http://www.cnblogs.com/lzjsky/p/4933593.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!