• Android Http 下载


    在安卓中,可以直接用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);
    	}
    });

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

  • 相关阅读:
    function to_timestamp(timestamp without time zone, unknown) does not exist
    Xshell连接不上Ubuntu解决方式
    怎样使用MobaXterm上传文件到远程Linux系统 MobaXterm怎么使用连接远程服务器?
    notepad++怎样删除空行
    思维脑图在线制作工具网址
    @ApiImplicitParams
    .bat批出处理文件
    主题模型及其在文本情感分析中的应用
    表达式求职JAVA(转)
    2013华为校园招聘java实现(大家水个回复啊)
  • 原文地址:https://www.cnblogs.com/lzjsky/p/4933593.html
Copyright © 2020-2023  润新知