GridView加適配器的方式html
若是僅僅只用gridview加適配器的方法,由於加載圖片是須要時間的,若是你直接在getview中加載圖片的話,就會影響UI,照成滑動的時候卡頓。因此,每加載一個圖片的時候,咱們會開啓一個額外的進程,這樣就不會影響UI主線程了。android
僅僅只是開啓一個額外的線程會出現「亂序」的問題。也就是「併發性」的問題。併發
由於,當你進行滑動的時候,凡是通過的區域都會打開線程加載圖片,每一個線程執行完畢的時間不是固定的。只有當線程執行完畢後,纔會顯示在當前屏幕上。所以,當你大規模的滑動的時候,有些區域的圖片還沒顯示就被滑走,可是他們的線程還在,全部的線程都擠到當前屏幕顯示。因此被滑過的圖片會在相續的顯示,每每一個位置要顯示好幾張不一樣的圖片(由於線程加載的時差相互覆蓋),最後顯示爲該屏幕原本的圖片。ide
這就是「併發性」的問題,併發性是指兩個或多個事件在同一時間間隔內發生。spa
這樣應該就能明白爲何會出現併發性問題,由於同時有多個線程再執行,咱們不能保證圖片的線程在被滑過以後就中止執行了。.net
解決併發性問題,我最近嘗試的方式有兩種,一種Android doc上推薦的方法,還有一個就是看guolin大神的博客上的方法。線程
Android doc上推薦的方式htm
Android doc上推薦的方法,思路是將線程與每一個位置(ImageView)綁定,在圖片沒有加載完以前先用一個站位圖片站着,若正在執行的線程不是當前圖片所綁定的線程就取消掉,再也不加載。這樣就只有被綁定的線程才能執行,不會在一個位置上重複出現多張不一樣的圖片。blog
參考連接:進程
http://developer.android.com/training/displaying-bitmaps/process-bitmap.html
guolin大神的setTag方式
而guolin大神用了一個ImageView.setTag(imgeUri),爲每一個位置綁定一張圖片,其中p_w_picpathUri是每張圖片在本地的存儲路徑,既能保證不重複,也能夠用它來加載圖片。
參考連接:http://blog.csdn.net/guolin_blog/article/details/9526203
因此我本身試着用了setTag()寫了一下,確實能解決問題。可是,圖片出現的速度比guolin大神的慢了許多,比Android doc也慢了許多。想了一下,原來是由於Android doc的方法是在判斷後有取消線程的執行。而我只是在線程執行以後,判斷該線程所加載的圖片是否與該位置綁定。沒綁定就不顯示。這樣全部線程無論有用沒有都執行了一遍,效率很低。而guolin大神的又不同,由於他重寫了OnScoll(),在滑動時,全部線程都取消,只有停下來的時候纔開線程,因此,也不會有無用的線程在執行。我以爲這樣也很不錯!