Re: [分享] 在ListView顯示網路圖片+快取

看板AndroidDev作者 (〆)時間13年前 (2011/04/22 11:37), 編輯推噓4(4010)
留言14則, 3人參與, 最新討論串2/3 (看更多)
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

04/22 12:24, , 1F
給我過大大真是ANDROID分享的狂人,長知識+1
04/22 12:24, 1F

04/25 20:23, , 2F
囧,我用1.6 emulator反而是give大的會掛點..OOM..
04/25 20:23, 2F

04/26 12:54, , 3F
我反而是兩種都不會掛點...晚點找張更大的圖來測試一下
04/26 12:54, 3F

04/26 12:55, , 4F
sjrom 或許可以參考 http://ppt.cc/EWo8
04/26 12:55, 4F

04/26 22:44, , 5F
ya.做法差不多,後來就直接判斷size然後做bitmap options
04/26 22:44, 5F

04/26 22:45, , 6F
因為要一次全部decocde到mem實在是太嚇人..至於怎samplesize
04/26 22:45, 6F

04/26 22:47, , 7F
就是看每個人的需求了..A_A",另外還有個可以稍稍多要點
04/26 22:47, 7F

04/26 22:49, , 8F
另外有個 inTempStorage ,官網是建議 16k.
04/26 22:49, 8F

04/26 22:56, , 9F
點空間的↗
04/26 22:56, 9F

04/26 23:00, , 10F
感謝b大提供的資訊,另外裡面的loadURL function,如果mem
04/26 23:00, 10F

04/26 23:02, , 11F
控制的好的話,可以不用宣告Synchronized ,網速夠的話
04/26 23:02, 11F

04/26 23:02, , 12F
應該會有加快loading的效果?
04/26 23:02, 12F

04/26 23:21, , 13F
是的,我會偏向使用Thread pool,一次多張下載比較爽XD
04/26 23:21, 13F

04/26 23:22, , 14F
不過之前是小範例就沒寫太多了 哈
04/26 23:22, 14F
文章代碼(AID): #1DiFVX3N (AndroidDev)
文章代碼(AID): #1DiFVX3N (AndroidDev)