亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

老師那個解決錯位的辦法好像有問題

上述出現的錯位問題是這樣的: 顯示的某一個列表項,左邊圖片和右邊文字不匹配,但過一會。就會顯示正確匹配了。出現原因就是ListView的緩存機制,在作怪。ListView緩存機制 我們在加載圖片的時候有一個下載的時間

問題,這樣convertview 實際上已經返回了,而它所需的圖片資源可能還在下載中,這樣的話 文字是當前的文字,而圖片呢?就是加載之前convertview里面的圖片,因此圖片錯位是避免不了的了。因此我覺得老師那個解決錯位的辦法好像 不太對。

正在回答

3 回答

錯位是避免不了,我們要做的是加載前判斷下,是不是要加載的圖,這樣錯位的就不會顯示出來

0 回復 有任何疑惑可以回復我~
#1

王雅舒

老師你的意思是: 緩存機制會通過調用ImageLoader的handleMessage里的mImageView.setImageBitMap(m.obj) 的代碼來設置 圖片嗎?? 然后這個m.obj實際上是錯位的url得來的....
2015-06-23 回復 有任何疑惑可以回復我~
#2

王雅舒

不太懂,為什么......
2015-06-23 回復 有任何疑惑可以回復我~
#3

王雅舒

明白了..請忽略
2015-06-23 回復 有任何疑惑可以回復我~

你其實沒明白。

listView convertView緩存機制 & 異步加載圖片 問題剖析

? ??先介紹下listView的convertView緩存機制 & 異步加載圖片:


? ??convertView緩存機制:我們假設一個屏幕一次顯示8個item,當第9個item劃進屏幕時,ListView對adapter說,返給我一個view,我要顯示。adapter調用getView()方法,由于使用了convertView緩存機制,getView(),會在上一次new 出來的8個itemview中取出第一個itemview(這時因為不顯示了,listview將其變成了convertview),并給了listview作為第9個item的view。

? ??異步加載圖片:如果我們不適用異步加載圖片,那么必須要在每次getview()返回一個view前把view的iamgeview設置好了圖片再返回給Listview,這意味著我必須等網絡下載好了這個圖片我才能返回給listview一個item,很明顯,下滑效果是屏幕卡頓的半天沒反應。但是使用異步加載,先讓adapter返回一個view,view的iamgeview我先不確定,并開啟一個新線程去下載圖片,等圖片下載好了,再去更新到這個view的imageview。當然了,一般只需要異步加載圖片,而文字信息默認認為已經取得了,當然文字也是可以異步加載的。


? ? 但是,當我們使用了listView在通過 convertView緩存機制 & 異步加載圖片時,若快速滑動屏幕,會發生圖片閃頓2次以上的錯圖最后才能正確顯示圖片的現象。我們來剖析原因:? ??

? ? 之所以會在下滑后,圖片顯示出一個之前的錯圖,是因為convertview的緩存,這個convertview的圖片還是保持著上一次的圖片,然而我這里的新線程還沒來得及下載好并更新到這個imageview,你的老圖片就已經顯示上去了。所以造成了第一次的錯圖。但是這里不會出現閃!

? ? 然后快速下滑,發現第一個錯圖就要被正確的第二張圖顯示替換時,我又把屏幕下滑了,所以我又換了個圖,第二次又錯圖了。我假設每個圖片下載需要1s,由于我使每個異步線程人工阻塞了1s,那么上來有8個異步線程在運行(編號1-8),如果1s之內下滑了ListView比如說下滑了8個,那么新更新的8個item還是用的以前老view(不是新new出來的),并且又開啟了8個異步線程(編號9-16)。因為之前顯示了是老的圖片。然后1-8號異步線程運行完畢,更新ImageView,所以出現了一次閃,緊跟著9-16異步線程運行完畢,又更新imageView,又出現了一次閃。最終顯示正確結果。這就是下滑時先顯示默認圖片,再閃一下錯誤圖片,最后閃一下正確圖片的本質過程。這次是另一種錯誤原因。

? ? 所以,我們為了解決問題,分兩步走:

? ??? ? 1,在getview返回一個convertView之前,我把imageview設置為一個固定的圖片(ic_launcher),覆蓋掉convertview的老錯圖,這樣就不會在顯示時造成錯圖尷尬了。所以convertView緩存機制造成的錯圖原因得到解決,因為: 緩存造成的錯圖是無法避過的········

? ??? ? 2.在把imageview設置為一個固定的圖片(ic_launcher),覆蓋掉convertview的老錯圖之后,我為ImageView設置了一個tag(url),tag里放的是一個唯一標識url,并且在異步線程里傳入url,當線程下載好了后,先判斷iamgeview的tag是不是我下載的這個url,如果是,說明主人還沒有滑動,還在等我加載圖片,那么我趕緊顯示上去;如果tag!=url了,說明主人早已又滑了一段,我所在的convertView又被替換了一次,所以我還是別顯示了!


0 回復 有任何疑惑可以回復我~

明白了....

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
Android必學-異步加載
  • 參與學習       50616    人
  • 解答問題       333    個

了解Android中的異步加載處理方法,這是面試問的最多的知識點

進入課程

老師那個解決錯位的辦法好像有問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號