2016-05-16 15 views
2

問題RecyclerViewを非同期でどのように読み込む必要がありますか?

私のRecyclerViewは写真で要素を表示します。すべての写真がインターネットからダウンロードされており、数秒かかることがあります。したがって、私はUIスレッドをブロックしないようにしようとし、Handlerに渡しますが、RecyclerViewのリサイクルのために画像が正しく表示されません。

これは、それがどのように見えるかです:私はスクロールダウンリストの項目にリスト項目に

ロード画像1を2

1.

ロード画像2。リスト項目に

ロード画像3を20

ロード画像4リスト項目に21

ロード画像4リスト項目にリストアイテム21

に20

ロード画像5

最後はすべて正常ですが、読み込みプロセス中に、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

ハンドラーは、それらを導入したスレッドのコンテキストで動作します。ハンドラがUIスレッドで起動されている場合、ハンドラはUIスレッドで実行されません。 – Blackbelt

+0

UIスレッドでは実行されません。ハンドラーの初期化は少し時間がかかります。 – Ukubu

+0

ここに示すコードはどのような方法とクラスに含まれていますか? –

答えて

1

Glideを使用することをお勧めします。イメージを非同期的に読み込んでキャッシュします。

例として、あなたは、AndroidのドキュメントProcessing Bitmaps Off the UI Thread

から、このような

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

ええ、インターネットからUriを取得するのに時間がかかります。フェッチコードをHandler/Thread/Whatever runnableに入れなければなりません。上のコードを見てください。 – Ukubu

+0

@Uukubu Glideがあなたのスレッドを管理しています –

1

としてそれを使用したいしかし、私はあなたがrecyclerviewで画像をロードするためにUILライブラリを使用することをお勧めします。これは、最も一般的で効率的なライブラリであり、統合が容易です。

特徴:

マルチスレッド画像ローディング(非同期または同期)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

使用グライドライブラリ画像ローダーライブラリを比較することができます。 Googleが推奨するライブラリであり、Googleフォト、ハングアウトなどのさまざまなGoogleアプリでも使用されています。

関連する問題