像我们都在使用的微信,它的朋友圈中就好多图文信息;使用的新浪微博,用户的图标也是图片信息,等等诸如此类。由此可见,对于图片的请求处理,非常重要,我们做开发的应该掌握。今天介绍一下笔者在开发Android项目过程中使用过的一些代码。
这里给出一段直接从服务器获取图片数据的代码,提供两种方式的返回值,一种是字节类型的,一种是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; } }
有些人在低版本Android系统中,直接使用上述代码,不会出现问题,但是在2.3版本之后的系统中,会出现网络异常,出现的错误信息如下:
Android.os.NetworkOnMainThreadException
解决的方案也很简单,在需要网络请求的时候,在主线程开启一个子线程就可以了,让耗时的操作放在子线程中进行,做完了之后,再将结果返回给主线程。
有些人在代码中,可能会出现如下的错误,很奇怪,没有提示信息,只能找到如下语句:
android java.net.SocketException:Permission denied
<uses-permission android:name="android.permission.INTERNET" />
在上面,我们在获取图片信息的时候,提供了一个返回字节的方法,这里再提供一个帮助类,可以将字节转换为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(); } }
对于网络图片的加载还要注意一些问题,比如我们如果是图片应用的话,要注意应用的缓存情况,以获得较好的应用体验。但是如果缓存过大,超过了手机的内存限制,又会出现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
对于webview这样直接请求网页数据,以及根据一个地址返回得到xml/json的代码,本文不做说明。
原文地址:http://blog.csdn.net/ljtyzhr/article/details/41820501