Android从网络上下载图片实现

1、背景介绍

网络上图片的请求,是我们最常见的网络请求之一,不亚于对json/xml数据的请求。一般要展示给用户看的,都不会是纯粹的文字,往往都是图文信息。而在移动互联网时代,图文又往往需要最新的资讯,数据都是从网络上获取。

像我们都在使用的微信,它的朋友圈中就好多图文信息;使用的新浪微博,用户的图标也是图片信息,等等诸如此类。由此可见,对于图片的请求处理,非常重要,我们做开发的应该掌握。今天介绍一下笔者在开发Android项目过程中使用过的一些代码。

2、思路分析

(1)取得与服务器的连接

(2)设置链接属性

(3)从客户端获取数据

(4)生成图片,关闭链接

3、网络上下载图片

从网络上下载图片,根据我们对HTTP协议的分析,知道先要建立连接,设置请求方式等问题。那么得到的结果呢?这里,我们提供两种方式给读者作为参考,在实际应用中,两者都有其合适的应用场景。

3.1 JAVA代码如下:

这里给出一段直接从服务器获取图片数据的代码,提供两种方式的返回值,一种是字节类型的,一种是Bitmap类型的,后者可以直接应用在图片资源位置,当做背景图片设置。

public class ImageService {

	/**
	 * 获取图片
	 * @param path 图片路径
	 * @return
	 */
	public static byte[] getImageByte(String path) throws IOException {
		URL url = new URL(path);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET"); // 设置请求方法为GET
		conn.setReadTimeout(5 * 1000); // 设置请求过时时间为5秒
		InputStream inputStream = conn.getInputStream(); // 通过输入流获得图片数据
		byte[] data = StreamTool.readInputStream(inputStream); // 获得图片的二进制数据
		return data;
	}

	/**
	 * 获取图片
	 * @param path 图片路径
	 * @return
	 */
	public static Bitmap getImageBitmap(String path) throws Exception{
		URL url = new URL(path);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setConnectTimeout(5000);
		conn.setRequestMethod("GET");
		if(conn.getResponseCode() == 200){
			InputStream inStream = conn.getInputStream();
			Bitmap bitmap = BitmapFactory.decodeStream(inStream);
			return bitmap;
		}
		return null;
	}

}

3.2 报错信息:

有些人在低版本Android系统中,直接使用上述代码,不会出现问题,但是在2.3版本之后的系统中,会出现网络异常,出现的错误信息如下:

Android.os.NetworkOnMainThreadException

实际上,这是Android系统升级之后,对网络做出的规范化处理,在高版本的Android系统中,不再允许在主线程直接使用耗时的操作,严格禁止使用网络请求这样的,会阻塞主线程的代码片段。

解决的方案也很简单,在需要网络请求的时候,在主线程开启一个子线程就可以了,让耗时的操作放在子线程中进行,做完了之后,再将结果返回给主线程。

有些人在代码中,可能会出现如下的错误,很奇怪,没有提示信息,只能找到如下语句:

android java.net.SocketException:Permission denied

这句话解读起来也非常方便,意思是说没有权限,没有访问网络的权限,这个时候,需要我们在mainfest文件中添加网络访问的权限就行了。权限如下:

<uses-permission android:name="android.permission.INTERNET" />

4、一个工具类

在上面,我们在获取图片信息的时候,提供了一个返回字节的方法,这里再提供一个帮助类,可以将字节转换为Bitmap。代码如下:

byte[] data = StreamTool.read(inStream);
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

提供一个帮助类,如下:

public class StreamTool {
	/**
	 * 从流中读取数据
	 * @param inStream
	 * @return
	 */
	public static byte[] read(InputStream inStream) throws Exception{
		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = 0;
		while( (len = inStream.read(buffer)) != -1){
			outputStream.write(buffer, 0, len);
		}
		inStream.close();
		return outputStream.toByteArray();
	}

}

5、网络框架

对于网络图片的加载还要注意一些问题,比如我们如果是图片应用的话,要注意应用的缓存情况,以获得较好的应用体验。但是如果缓存过大,超过了手机的内存限制,又会出现OOM的异常。在网络请求中,我们最常使用的网络框架是:

它的源码公开在Github上,需要的话可以直接去下载:

https://github.com/nostra13/Android-Universal-Image-Loader

在网络上面也有很多牛人写的博客,其中有一个对这个控件有详细解析的,可以去看看:

CSDN的博客:http://blog.csdn.net/wangjinyu501/article/details/8091623

51CTO的博客:http://smallwoniu.blog.51cto.com/3911954/1336194

6、数据请求

对于webview这样直接请求网页数据,以及根据一个地址返回得到xml/json的代码,本文不做说明。

时间: 2024-12-15 00:56:46

Android从网络上下载图片实现的相关文章

Android 异步从网络上下载图片

package com.example.android_asynctask; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClie

网络上下载图片

最新版SDWebImage的使用 http://www.cocoachina.com/ios/20141212/10622.html ios 从网络下载图片,保存,并用imageview从保存中显示: http://www.cnblogs.com/PirateCaptain/articles/2538575.html

Android解析获取网络上的图片(支持bmp格式)

Android学习系列 - 显示网络上的图片(支持bmp格式)) 见如下代码: /** * 到Url地址上去下载图片,并回传Bitmap回來 * * @param imgUrl * @return */ public static Bitmap getBitmapFromUrl(String imgUrl) { URL url; Bitmap bitmap = null; try { url = new URL(imgUrl); InputStream is = url.openConnecti

[Android]通过setImageURI设置网络上面的图片

设置imageView显示网络上的图片 picUrl = new URL(getIntent().getExtras().getString("map_url")); Bitmap pngBM = BitmapFactory.decodeStream(picUrl.openStream()); mapIMG.setImageBitmap(pngBM);

java web 从服务器上下载图片资料

package com.Action; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class HttpUtils {

android从网络上异步加载图像

研究了android从网络上异步加载图像: (1)由于android UI更新支持单一线程原则,所以从网络上取数据并更新到界面上,为了不阻塞主线程首先可能会想到以下方法. 在主线程中new 一个Handler对象,加载图像方法如下所示 [java] view plaincopyprint? private void loadImage(final String url, final int id) { handler.post(new Runnable() { public void run()

从网络上下载文件

文件的下载: 使用HTTP协议下载文件 ·创建一个HttpURLConnection对象 HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection(); ·获得一个InputStream对象 urlConn.getInputStream() ·访问网络的权限 android.permission.INTERNET ·从网络上下载文件夹 HttpDownload.java中的代码: public class Http

Android控件上添加图片

项目中有一个点赞功能,点赞的小图标添加在点赞列表旁边,在xml里可以进行设置,也可以在代码中进行绘图. 下面是两种方法的设置: 1.xml里:一些控件:button.textView等等里面有个属性是android:drawableLeft 就可以将pic设置到text的左边.good.... 2.代码中: TextView txtlikedList = new TextView(this.getContext()); Drawable drawable= getResources().getD

as3.0加载本地或网络上的图片

加载本地或网络上的图片,我们一般只用Loader及URLRequest这两个类就可以完成,URLRequest即可以加载本地的,也可以加载网络的.代码如下 import flash.display.Loader; import flash.net.URLRequest; var loader:Loader = new Loader(); var request:URLRequest = new URLRequest('img/123.png'); loader.y = 200; loader.l