1. 程式人生 > >Android使用HttpURLConnection下載圖片

Android使用HttpURLConnection下載圖片

    講到http就必需要了解URI和URL

URI (uniform resource identifier)統一資源標誌符;
URL(uniform resource location )統一資源定位符(或統一資源定位器);

可以理解成URL是URI的子集,URI是一抽象的識別符號,URL可以理解成具體的識別符號;只要是網路上的資源就能找到唯一的URL。

目錄結構


效果圖


關鍵程式碼

HttpUtils.java類

package com.dzt.downloadimage.utils;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

/**
 * http工具類 http可以使用HttpURLConnection或HttpClient
 * 
 * @author Administrator
 * @date 2014.05.10
 * @version V1.0
 */
public class HttpUtils {

	/**
	 * 獲取網路圖片
	 * 
	 * @param urlString
	 *            如:http://f.hiphotos.baidu.com/image/w%3D2048/sign=3
	 *            b06d28fc91349547e1eef6462769358
	 *            /d000baa1cd11728b22c9e62ccafcc3cec2fd2cd3.jpg
	 * @return
	 * @date 2014.05.10
	 */
	public static Bitmap getNetWorkBitmap(String urlString) {
		URL imgUrl = null;
		Bitmap bitmap = null;
		try {
			imgUrl = new URL(urlString);
			// 使用HttpURLConnection開啟連線
			HttpURLConnection urlConn = (HttpURLConnection) imgUrl
					.openConnection();
			urlConn.setDoInput(true);
			urlConn.connect();
			// 將得到的資料轉化成InputStream
			InputStream is = urlConn.getInputStream();
			// 將InputStream轉換成Bitmap
			bitmap = BitmapFactory.decodeStream(is);
			is.close();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			System.out.println("[getNetWorkBitmap->]MalformedURLException");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("[getNetWorkBitmap->]IOException");
			e.printStackTrace();
		}
		return bitmap;
	}
}
使用到網路必需要新增許可權和要有網路,否則下載失敗
<uses-permission android:name="android.permission.INTERNET" />
下載屬於耗時的操作,如果放在UI執行緒出容易出現ANR;所以Android4.0之後對網路的操作不能放在UI執行緒,在這裡我把下載放在AsyncTask處理。
class downloadImageTask extends AsyncTask<String, Integer, Boolean> {

		@Override
		protected Boolean doInBackground(String... params) {
			// TODO Auto-generated method stub
			System.out.println("[downloadImageTask->]doInBackground "
					+ params[0]);
			mDownloadImage = HttpUtils.getNetWorkBitmap(params[0]);
			return true;
		}

		// 下載完成回撥
		@Override
		protected void onPostExecute(Boolean result) {
			// TODO Auto-generated method stub
			image.setImageBitmap(mDownloadImage);
			System.out.println("result = " + result);
			super.onPostExecute(result);
		}

		// 更新進度回撥
		@Override
		protected void onProgressUpdate(Integer... values) {
			// TODO Auto-generated method stub
			super.onProgressUpdate(values);
		}

	}
在onPostExecute和onProgressUpdate可以方便我們更新UI,當然也可以開一個執行緒處理,使用AsyncTask就更方便。

完整Demo:http://download.csdn.net/detail/deng0zhaotai/7326005

OkHttp是Square的一款產品,是一個Java的開源HTTP和SPDY客戶端開發包,支援Android。Android自帶的兩個HTTP框架(HttpURLConnection和HttpClient),在各種Android OS版本一直充斥著錯誤,可以使任何理智的開發者走向崩潰。不過幸運地是,OkHttp解決了這些問題。OkHttp是建立在HttpUrlConnection上,從Android程式碼庫保持最新的修復,這意味著再也沒有與舊作業系統版本出現相容性問題的噩夢