文档章节

Android 下载网络图片注意的问题

李光正
 李光正
发布于 2015/10/15 14:53
字数 391
阅读 4
收藏 0

在使用的过程中,如果网络比较慢的话,则会出现下载不成功的问题。经过google搜索,终于解决了这个问题。

一般我们会用以下的代码:

java代码:


//获取connection,方法略
conn = getURLConnection(url);
is = conn.getInputStream();

//获取Bitmap的引用
Bitmap bitmap = BitmapFactory.decodeStream(is)


       但是网络不好的时候获取不了图片,推荐使用以下的方法:

java代码:
//获取长度
int length = (int) conn.getContentLength();
if (length != -1) {
byte[] imgData = new byte[length];
byte[] temp=new byte[512];
int readLen=0;
int destPos=0;

while((readLen=is.read(temp))>0){
System.arraycopy(temp, 0, imgData, destPos, readLen);
destPos+=readLen;
}

bitmap=BitmapFactory.decodeByteArray(imgData, 0, imgData.length);
}


        使用上面的方法的好处是在网速不好的情况下也会将图片数据全部下载,然后在进行解码,生成图片对象的引用,所以可以保证只要图片存在都可以下载下来。当然在读取图片数据的时候也可用java.nio.ByteBuffer,这样在读取数据前就不用知道图片数据的长度也就是图片的大小了,避免了有时候 http获取的length不准确,并且不用做数组的copy工作。

java代码:
public synchronized Bitmap getBitMap(Context c, String url) {
URL myFileUrl = null;
Bitmap bitmap = null;
try {

myFileUrl = new URL(url);
} catch (MalformedURLException e) {
bitmap = BitmapFactory.decodeResource(c.getResources(),
com.jixuzou.moko.R.drawable.defaultimg);
return bitmap;
}

try {
HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
int length = (int) conn.getContentLength();
if (length != -1) {
byte[] imgData = new byte[length];
byte[] temp = new byte[512];
int readLen = 0;
int destPos = 0;
while ((readLen = is.read(temp)) > 0) {
System.arraycopy(temp, 0, imgData, destPos, readLen);
destPos += readLen;
}
bitmap = BitmapFactory.decodeByteArray(imgData, 0,imgData.length);
}
} catch (IOException e) {
bitmap = BitmapFactory.decodeResource(c.getResources(),com.jixuzou.moko.R.drawable.defaultimg);
return bitmap;
}
return bitmap;
}

本文转载自:http://blog.csdn.net/liguangzhenghi/article/details/7211683

下一篇: android 动画
李光正
粉丝 5
博文 64
码字总数 0
作品 0
大兴
私信 提问
(android开源库android-gif-drawable)第二篇 加载网络gif图片

大家好, 今天给大家带来如何使用 android开源库android-gif-drawable来 加载网络gif图片 同样的DEMO下载地址在 最后 请大家去下载 。 如果gif图片地址无效 了。 请大家自行到网上去寻找一个...

一个游戏8
2014/11/15
8.1K
5
如果让我重新设计一款Android App

开发工具的选择 开发工具我将选用Android Studio,它是Google官方指定的Android开发工具,目前是1.2.2稳定版,1.3的预览版也已经发布了。Android Studio的优点就不需多说了,GitHub上大部分的...

AlexMahoneFBI
2015/11/13
286
1
Android网络通信库Volley简介

什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Google I/O 2013上,Vol...

蜗牛TT
2013/08/05
1K
0
android应用开发 网络编程与常见功能优化总结

一般的应用都是从服务器获取数据,然后通过极致的界面风格,将数据清晰,明朗的展现给用户。、 那么就可以分为这两块: 1.界面UI 追求极致 2.功能 2.1获取数据:主要是与服务器通信,那么就要...

补全
2013/04/07
585
1
Android Activity / Fragment内存泄露引论

 Android Activity / Fragment内存泄露引论 Android发生OOM(OutOfMemoryError)问题的重要因素是编程设计不佳的代码出现内存泄露(Leak)造成Android分配的内存紧张。关于内存泄漏的问题...

开开心心过
2017/10/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部