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线程出easy出现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
网络上一个不错的资源:http://square.github.io/okhttp/
OkHttp是Square的一款产品,是一个Java的开源HTTP和SPDYclient开发包,支持Android。Android自带的两个HTTP框架(HttpURLConnection和HttpClient),在各种Android OS版本号一直充斥着错误,能够使不论什么理智的开发人员走向崩溃。只是幸运地是,OkHttp攻克了这些问题。OkHttp是建立在HttpUrlConnection上,从Android代码库保持最新的修复,这意味着再也没有与旧操作系统版本号出现兼容性问题的噩梦