作者givemepass (〆)
看板AndroidDev
标题Re: [分享] 在ListView显示网路图片+快取
时间Fri Apr 22 11:37:02 2011
43
badhabit大的程式看了让人真是感觉舒服
无论变数名称 编码风格跟习惯 我觉得很漂亮
看了这篇真的让我对ListView有更深刻的感受
而这篇刚好小弟之前有研究过从网路下载图片的议题
之前朋友问我怎麽从网路下载超大图片
我找了蛮久的资料 後来终於让我找到解决的写法
现在分享给大家
一般来说 网路快慢会影响取得图片的速度
而android对於存取网路资源这方面有5秒的限制
在小弟之前的文章有翻译过一篇 里面也有提到相关的议题
测试了一下badhabit大的程式 似乎没有做相关的预防
例如跑高解度的图片 会出现当机的状况
例如这张
http://ppt.cc/;fh~ 2.85mb 应该够大了:P
就会跳出这样的画面
http://uploadingit.com/file/m4oqyvohae9cqfx1/DownloadImageFail.png
因此小弟擅自改了一下badhabit大的程式 可以正常的跑
http://uploadingit.com/file/5db08oskidpcjeqo/downloadImageSuccess.png
整体程式没有变动多少 希望badhabit大不要见怪
首先我改了原本程式main.java的部分 第八行
GetWebImg ImgCache = new GetWebImg(this);
因为我下载图片的时候 需要Context
再来是GetWebImg.java的部分
小弟修改的部分有
加了建构子
public GetWebImg(Context c){
con = c;
}
改了LoadUrlPic 函式
public synchronized Bitmap LoadUrlPic(Context c, String url) {
URL imgUrl;
Bitmap defaultImg = BitmapFactory.decodeResource(con.getResources(),
wu.listview.webimg.R.drawable.icon);
Bitmap webImg = null;
try {
imgUrl = new URL(url);
}
catch (MalformedURLException e) {
Log.d("MalformedURLException",e.toString());
return defaultImg;//抓不到网路图时, 读预设图片
}
try {
HttpURLConnection httpURLConnection =
(HttpURLConnection) imgUrl.openConnection();
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(false);
httpURLConnection.setUseCaches(false);
httpURLConnection.connect();
InputStream inputStream = httpURLConnection.getInputStream();
int length = (int) httpURLConnection.getContentLength();
int tmpLength = 512;
int readLen = 0,desPos = 0;
byte[] img = new byte[length];
byte[] tmp = new byte[tmpLength];
if (length != -1) {
while ((readLen = inputStream.read(tmp)) > 0) {
System.arraycopy(tmp, 0, img, desPos, readLen);
desPos += readLen;
}
webImg = BitmapFactory.decodeByteArray(img, 0,img.length);
}
httpURLConnection.disconnect();
}
catch (IOException e) {
Log.d("IOException",e.toString());
return defaultImg; //抓不到网路图时, 读预设图片
}
return webImg;
}
这样一来 无论多大的图片下载 它都不会当掉了
除非网站挂了 就使用预设的图片
附上改过的程式码
http://uploadingit.com/file/ylhjk0osugues8th/ListView_WebImg_update.zip
如果有观念不正确或者更好的写法 请告知小弟 避免误导大家 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.221.115.4
1F:推 sorrel20567:给我过大大真是ANDROID分享的狂人,长知识+1 04/22 12:24
2F:推 sjrom:囧,我用1.6 emulator反而是give大的会挂点..OOM.. 04/25 20:23
3F:推 badhabit:我反而是两种都不会挂点...晚点找张更大的图来测试一下 04/26 12:54
5F:→ sjrom:ya.做法差不多,後来就直接判断size然後做bitmap options 04/26 22:44
6F:→ sjrom:因为要一次全部decocde到mem实在是太吓人..至於怎samplesize 04/26 22:45
7F:→ sjrom:就是看每个人的需求了..A_A",另外还有个可以稍稍多要点 04/26 22:47
8F:→ sjrom:另外有个 inTempStorage ,官网是建议 16k. 04/26 22:49
9F:→ sjrom:点空间的↗ 04/26 22:56
10F:→ sjrom:感谢b大提供的资讯,另外里面的loadURL function,如果mem 04/26 23:00
11F:→ sjrom:控制的好的话,可以不用宣告Synchronized ,网速够的话 04/26 23:02
12F:→ sjrom:应该会有加快loading的效果? 04/26 23:02
13F:推 badhabit:是的,我会偏向使用Thread pool,一次多张下载比较爽XD 04/26 23:21
14F:→ badhabit:不过之前是小范例就没写太多了 哈 04/26 23:22