android获取网络图片的用法

本文介绍了一个常见的Android开发问题:从网络加载图片到ImageView时,Bitmap变为null的原因及解决方案。通过改进图片流读取方式,确保BitmapFactory正确解析。
关于android获取网络图片主要是吧网络图片的数据流读入到内存中然后用
Bitmap bitMap = BitmapFactory.decodeByteArray(data, 0, length);

方法来将图片流传化为bitmap类型 这样才能用到
imageView.setImageBitmap(bitMap);

来进行转化,这些大家都了解,主要的问题在获取bitmap时候居然为null 怎么回事呢?我开始的时候遇见这个问题,并且困扰了一段时间,最后发现错误了
下面是我的错误代码

byte[] data = GetImageForNet.getImage(path);
int length = data.length;

Bitmap bitMap = BitmapFactory.decodeByteArray(data, 0, length);
imageView.setImageBitmap(bitMap);

下面是 GetImageForNet.getImage()方法的代码清单

public static byte[] getImage(String path) throws Exception {
URL url = new URL(path);
HttpURLConnection httpURLconnection = (HttpURLConnection)url.openConnection();
httpURLconnection.setRequestMethod("GET");
httpURLconnection.setReadTimeout(6*1000);
InputStream in = null;
byte[] b = new byte[1024];
int len = -1;
if (httpURLconnection.getResponseCode() == 200) {
in = httpURLconnection.getInputStream();
in.read(b);
in.close();
return b;


}
return null;
}

看起来没有问题 获取网络图片输入流,填充二进制数组,返回二进制数组,然后使用 Bitmap bitMap = BitmapFactory.decodeByteArray(data, 0, length); data就是返回的二进制数组
获取bitMap 看起来没有问题,可是bitMap就是为null!汗!最后慢慢整理思路,排除法去查找出现异常的地方,最后发现可能BitmapFactory.decodeByteArray方法中所需要的data不一定是传统意义上的字节数组,查看android api,最后发现BitmapFactory.decodeByteArray所需要的data字节数组并不是想象中的数组!而是把输入流传化为字节内存输出流的字节数组格式,找到原因后改进一下,成功!附上成功后的代码

try {
byte[] data = GetImageForNet.getImage(path);
String d = new String(data);
// File file = new File("1.jpg");
//OutputStream out = new FileOutputStream(file);
//out.write(data);
//out.close();
int length = data.length;
Bitmap bitMap = BitmapFactory.decodeByteArray(data, 0, length);
imageView.setImageBitmap(bitMap);
//imageView.seti
} catch (Exception e) {
Log.i(TAG, e.toString());
Toast.makeText(DataActivity.this, "获取图片失败", 1).show();
}

下面是改进后的 GetImageForNet.getImage()方法的代码清单

public static byte[] getImage(String path) throws Exception {
URL url = new URL(path);
HttpURLConnection httpURLconnection = (HttpURLConnection)url.openConnection();
httpURLconnection.setRequestMethod("GET");
httpURLconnection.setReadTimeout(6*1000);
InputStream in = null;
byte[] b = new byte[1024];
int len = -1;
if (httpURLconnection.getResponseCode() == 200) {
in = httpURLconnection.getInputStream();
byte[] result = readStream(in);
in.close();
return result;

}
return null;
}

public static byte[] readStream(InputStream in) throws Exception{
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len = in.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.close();
in.close();
return outputStream.toByteArray();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值