博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Http 下载
阅读量:4575 次
发布时间:2019-06-08

本文共 9724 字,大约阅读时间需要 32 分钟。

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

[html]
  1. <!-- 网络权限 -->  
  2.    <uses-permission android:name="android.permission.INTERNET"/>  
  3.    <!-- 操作sd卡权限 -->  
  4.    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  

不过有个需要注意的是,我使用的是最新的adt安卓开发集成eclipse的安装包,在使用网络服务的时候,处理网络请求的代码,不能在主线程中进行,不然安卓会提示错误。

 

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

[java]
  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类:

 

[java]
  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:

 

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

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

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

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

 

[java]
  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);	}});

 

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

转载于:https://www.cnblogs.com/lzjsky/p/4933593.html

你可能感兴趣的文章
链表逆序
查看>>
[zz]链表倒序
查看>>
简单易用的图像解码库介绍 —— stb_image
查看>>
HTML标签(二)
查看>>
在weblogic下运行Python脚本
查看>>
短信开发技术总结--协议篇
查看>>
HashMap实现原理分析
查看>>
私有类方法
查看>>
java网络编程Socket通信详解
查看>>
为什么使用Nosql:Nosql和SQL的区别
查看>>
<转>DNS服务系列之二:DNS区域传送漏洞的安全案例
查看>>
LINUX中常用操作命令
查看>>
【android】动画效果研究(View)【1】
查看>>
(三)常用的数学函数
查看>>
生产信息集成分析平台(MIIAS V1.0) 概述
查看>>
学习进度——第十五周
查看>>
简谈-网络爬虫的几种常见类型
查看>>
File对象目录列表器
查看>>
(K)ubuntu上将分区格式化成NTFS格式
查看>>
uva 12003 Array Transformer (大规模阵列)
查看>>