2016-05-16 26 views
2

問題我應該如何異步填充我的RecyclerView?

我的RecyclerView顯示帶有照片的元素。每張照片都從互聯網上下載,可能需要幾秒鐘的時間。因此,我儘量避免阻塞UI線程,然後將工作傳遞給Handler,但是,由於RecyclerView的回收行爲,它顯示的圖像不正確。

這是它的樣子:

加載圖像1〜表項1.

加載圖像2列表項2.

我向下滾動。

荷載圖像3列出項目20

荷載圖像4至列表項21.

荷載圖像4至列表項20.

荷載圖像5到列表項21.

最後一切正常,但在加載過程中,RecyclerView以錯誤的圖像回收ViewHolders!

我的代碼

mHandler.post(new Runnable() { 
     @Override 
     public void run() { 
      final Uri image = complexFetchingFunction(); 

      activity.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         holder.imageView.setImageURI(image); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
     } 
    }); 

處理器工作在一個單獨的線程。這是肯定的。 我知道所有這些事情發生,因爲我異步加載圖像和RecyclerView不喜歡它,但否則它是痛苦的緩慢。

有沒有人有解決方案?

+1

處理程序工作的線程誰的instatiate他們的上下文。如果處理程序在UI線程中被安裝,它將在UI線程上運行 – Blackbelt

+0

它不會在UI線程上運行。處理程序的初始化時間稍長一些。 – Ukubu

+0

什麼方法和類包含這裏顯示的代碼? –

回答

1

我建議使用Glide。它會爲你加載圖像,並緩存它們。

舉個例子,你會用它作爲這樣

Glide.with(context) 
      .load("your_url") 
      .into(your_imageview); 
+0

是的,但從互聯網取得Uri需要很長時間。我必須將獲取的代碼放入處理程序/線程/任何可運行的。看看上面的代碼。 – Ukubu

+0

@Ukubu Glide爲你管理線程 –

1

從Android電子文檔Processing Bitmaps Off the UI Thread

但我建議你使用UIL庫recyclerview加載圖像。這是最流行和高效的圖書館,易於整合。

特點:

多線程圖像加載(異步或同步)

ImageLoader的的配置(線程執行人,下載器,解碼器,存儲器和磁盤高速緩存,顯示圖像的選擇,等等)

寬定製

每個顯示圖像調用的許多自定義選項(存根圖像,緩存切換,解碼選項,位圖處理和顯示等)

在存儲器和/或磁盤上(設備的文件系統或SD卡) 聽力加載過程(包括下載進度)

欲瞭解更多詳情,請訪問https://github.com/nostra13/Android-Universal-Image-Loader

您也可以嘗試GLIDE

圖像緩存。 Glide也支持GIF圖像。

您可以比較形象裝載機庫here

+0

看起來你似乎誤解了我。我沒有與圖像加載問題。這個問題來自加載圖像和RecyclerView回收之前的延遲。因爲下載需要幾秒鐘(!),我必須在另一個線程中完成。之後,我從單獨的線程調用runOnUiThread並加載圖像。 – Ukubu

+1

http://developer.android.com/training/displaying-bitmaps/process-bitmap.html – USKMobility

+0

我想這是我正在尋找。 – Ukubu

1

使用滑翔庫。它是由谷歌推薦的圖書館,也用於谷歌照片,環聊等各種谷歌應用程序。

相關問題