解決由於異步加載和getview的混用導致圖片錯位

最近開發文件瀏覽列表一塊,其中通過接口查詢當前目錄下的所有文件和文件夾,對於文件夾我們就顯示文件夾的一些屬性:圖像是文件夾,然後可以進入他的下級目錄;但對於文件的話我們就需要根據不同的類型,例如圖片和視屏格式的圖片我們需要展示他們的縮略圖,
點擊文件的話,也是根據不同類型,可以由不同的系統應用進行打開這個網上的方式有很多。例如:

private void openFile(File file){ 

    Intent intent = new Intent(); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    //設置intent的Action屬性 
    intent.setAction(Intent.ACTION_VIEW); 
    //獲取文件file的MIME類型 
    String type = getMIMEType(file); 
    //設置intent的data和Type屬性。 
    intent.setDataAndType(/*uri*/Uri.fromFile(file), type); 
    //跳轉 
    startActivity(intent); //可以加個異常捕捉 

在這裏本人圖片和影視的縮略圖都是通過在adapter 中通過開源框架的ImagerLoader來實現的。但是在測試過程中,一直隨機出現比如文件夾的圖片顯示的是圖片的縮略圖,這個明顯是由於getview的緩存機制導致了,重用出現了錯誤,但是歸根結底還是由於異步加載的框架導致圖片加載不是實時的,可能加載圖片的時候這個item所對應的緩存已經有所變動,所以纔出現了這種bug。
既然知道了原因我們就需要解決這個問題,怎麼來呢。看來異步加載是不能直接用了。那我們就可以換一種思路,預先緩存好對應url的bitMap 然後通過map的形式加入到list 集合中,並且可以保存起來。每次我們拿到url先做緩存,如果這個url在集合中能夠查到,那我們就直接吧對應bitmap拿出來直接加載到對應的控件上。這種加載方式就相當於我們平時直接加載資源文件一樣,肯定不會出現錯位等問題了。
通過URl 獲取bitmap 的方式我們其實在ImageLoader 框架中可以找到。有一個ImageLoader.sysImageBitmap(url,options)返回的就是一個bitMap 。

發佈了34 篇原創文章 · 獲贊 88 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章