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

看板AndroidDev作者 (說唱猜做玩)時間11年前 (2013/10/29 18:56), 編輯推噓2(2014)
留言16則, 4人參與, 最新討論串3/3 (看更多)
不好意思把這篇文又挖出來, 請問一下,我把原po的project給run起來之後很ok沒什麼問題 但是改放在 fragment 裏面而不是 activity 整個畫面滑動變超卡的,怎麼會這樣? ※ 引述《givemepass (〆)》之銘言: : 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: 114.40.167.55

10/30 13:28, , 1F
你這樣講我不知道怎麼幫你XD
10/30 13:28, 1F

10/30 15:51, , 2F
這樣說好了 我把您的code加到我的project裡後
10/30 15:51, 2F

10/30 15:51, , 3F
圖片載入正常 但是會經常性的無法滑動 listview
10/30 15:51, 3F

10/30 15:52, , 4F
就是卡很久的感覺 然後又突然可以滑
10/30 15:52, 4F

10/30 15:52, , 5F
目前是摸不著頭緒該從哪些方向著手
10/30 15:52, 5F

10/30 15:52, , 6F
因為看logcat也看不出什麼跡象...
10/30 15:52, 6F

10/30 15:55, , 7F
或許和 fragment 沒什麼關係
10/30 15:55, 7F

10/30 15:56, , 8F
只是因為我的 listview 是放在 fragment 裏面所以提一下
10/30 15:56, 8F

10/30 15:56, , 9F
感謝您:)
10/30 15:56, 9F

10/30 16:54, , 10F
稍微觀察一下 如果沒看錯的話 似乎每次拉動 listview 時
10/30 16:54, 10F

10/30 16:54, , 11F
都會觸發下載@@
10/30 16:54, 11F

10/30 18:00, , 12F
main thread卡住要檢查什麼?
10/30 18:00, 12F

10/30 18:01, , 13F
你又檢查過哪些?
10/30 18:01, 13F

10/30 20:19, , 14F
為什麼不用現成Library就好了?
10/30 20:19, 14F

10/30 20:21, , 15F
UIL:http://goo.gl/obp2C 這套算寫很棒的
10/30 20:21, 15F

10/30 20:30, , 16F
太感激了 來玩看看!
10/30 20:30, 16F
文章代碼(AID): #1IRvHfFf (AndroidDev)
文章代碼(AID): #1IRvHfFf (AndroidDev)