課程
/移動開發
/Android
/Android必學-異步加載
寫上去也沒什么用啊
誰來解釋下
2016-01-23
源自:Android必學-異步加載 3-2
正在回答
樓上沒說到點子上。這是【同時】使用ConvertView和異步機制造成的。一個屏幕一次顯示8個item,當第9個item劃進屏幕時,ListView對adapter說,返給我一個view,我要顯示。adapter調用getView()方法,由于使用了緩存機制,getView()在初始化8個item以后所有返回的view(ConvertView)內存地址都是這8個中的。如果【不使用】異步機制加載圖片,那么返回的這個ConvertView是被更新以后返給ListView使用的。效果是上滑屏幕沒反應,等了半天,突然加載出來,但是不會閃。然而這里使用了異步機制,也就是說先返回ConvertView,再等異步線程修改,這是閃的本質!由于教程里使每個異步線程人工阻塞了1s,那么上來有8個異步線程在運行(編號1-8),如果1s之內下滑了ListView比如說下滑了8個,那么新更新的8個item還是用的以前的內存,【并且】又開啟了8個異步線程(編號9-16)。因為預先設定了一個默認圖片,所以先顯示綠色的默認icon圖片。然后1-8號異步線程運行完畢,更新ImageView(閃),緊跟著9-16異步線程運行完畢,又更新imageView(閃)。最終顯示正確結果。這就是下滑時先顯示默認圖片,再閃一下錯誤圖片,最后閃一下正確圖片的本質過程。如果給每個ImageView設置了tag以后,當1-8號異步線程運行完畢后,會發消息給handler,讓他進行更新ui的操作,可是在1-8號線程發消息之前,9-16號線程已經更新了1-8和9-16共用的ImageView控件的tag,所以1-8號線程的消息雖然發給了handler,但是不滿足條件,handler不會進行ui更新。
丿M灬S灬N丨
jsbintask22
我建議你們做個實驗,ListView中的item加一個checkbox控件。
1、假設item有20條。當前頁面能夠顯示的只有15條,也是剩下的5條,在不滑動的情況下,是看不到的。
2、當你選中第一條item的時候,再往下滑動。你會發現第16條的item也是被選中。而你根本沒有點擊過。
3、這是什么原因操作的,這是因為adapter在復用的時候造成。其實當第一條item不可見的時候,已經被第16條item復用了,第一條和第十六條item的區別就是里面的參數值。而第十六條item的其實是原封不動的第一條item。
4、以上表達的意思是視頻中出現的圖片問題的一種,滑動的時候,圖片會跳動先顯示一張,然后才顯示正確的。
5、至于說setTag和getTag的問題,子線程,它不是順序的,可能先執行的后加載完,后執行的先加載完,那就不是圖片跳動的問題,那就是錯亂的問題。什么意思呢,假如你第一個item通過異步方法獲取圖片然后setImageView。其實在多個線程的情況下,得到的bitmap不一定就是對應的那個bitmap。可能第一個item顯示的是第三個的圖片。
6、http://blog.csdn.net/lmj623565791/article/details/24333277?這里有分析adpterView 復用的問題。
sadfqjvoa
android有可能導致兩個值不一樣
舉報
了解Android中的異步加載處理方法,這是面試問的最多的知識點
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2016-05-30
樓上沒說到點子上。這是【同時】使用ConvertView和異步機制造成的。一個屏幕一次顯示8個item,當第9個item劃進屏幕時,ListView對adapter說,返給我一個view,我要顯示。adapter調用getView()方法,由于使用了緩存機制,getView()在初始化8個item以后所有返回的view(ConvertView)內存地址都是這8個中的。如果【不使用】異步機制加載圖片,那么返回的這個ConvertView是被更新以后返給ListView使用的。效果是上滑屏幕沒反應,等了半天,突然加載出來,但是不會閃。然而這里使用了異步機制,也就是說先返回ConvertView,再等異步線程修改,這是閃的本質!由于教程里使每個異步線程人工阻塞了1s,那么上來有8個異步線程在運行(編號1-8),如果1s之內下滑了ListView比如說下滑了8個,那么新更新的8個item還是用的以前的內存,【并且】又開啟了8個異步線程(編號9-16)。因為預先設定了一個默認圖片,所以先顯示綠色的默認icon圖片。然后1-8號異步線程運行完畢,更新ImageView(閃),緊跟著9-16異步線程運行完畢,又更新imageView(閃)。最終顯示正確結果。這就是下滑時先顯示默認圖片,再閃一下錯誤圖片,最后閃一下正確圖片的本質過程。如果給每個ImageView設置了tag以后,當1-8號異步線程運行完畢后,會發消息給handler,讓他進行更新ui的操作,可是在1-8號線程發消息之前,9-16號線程已經更新了1-8和9-16共用的ImageView控件的tag,所以1-8號線程的消息雖然發給了handler,但是不滿足條件,handler不會進行ui更新。
2016-01-25
我建議你們做個實驗,ListView中的item加一個checkbox控件。
1、假設item有20條。當前頁面能夠顯示的只有15條,也是剩下的5條,在不滑動的情況下,是看不到的。
2、當你選中第一條item的時候,再往下滑動。你會發現第16條的item也是被選中。而你根本沒有點擊過。
3、這是什么原因操作的,這是因為adapter在復用的時候造成。其實當第一條item不可見的時候,已經被第16條item復用了,第一條和第十六條item的區別就是里面的參數值。而第十六條item的其實是原封不動的第一條item。
4、以上表達的意思是視頻中出現的圖片問題的一種,滑動的時候,圖片會跳動先顯示一張,然后才顯示正確的。
5、至于說setTag和getTag的問題,子線程,它不是順序的,可能先執行的后加載完,后執行的先加載完,那就不是圖片跳動的問題,那就是錯亂的問題。什么意思呢,假如你第一個item通過異步方法獲取圖片然后setImageView。其實在多個線程的情況下,得到的bitmap不一定就是對應的那個bitmap。可能第一個item顯示的是第三個的圖片。
6、http://blog.csdn.net/lmj623565791/article/details/24333277?這里有分析adpterView 復用的問題。
2016-01-25
android有可能導致兩個值不一樣