zoukankan      html  css  js  c++  java
  • 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);
    	}
    });

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

  • 相关阅读:
    C#深入浅出 修饰符(二)
    HDU 5785 Interesting
    HDU 5783 Divide the Sequence
    HDU 5781 ATM Mechine
    UVA 714 Copying Books
    uva 1471 Defense Lines
    UVA 11134 Fabled Rooks
    UVA 11572 Unique Snowflakes
    UVA 11093 Just Finish it up
    UVA 10954 Add All
  • 原文地址:https://www.cnblogs.com/lzjsky/p/4933593.html
Copyright © 2011-2022 走看看