作者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