2017-08-21 4 views
0

サーバー(API REST)から、それぞれの情報を含むアイテム(製品)のリストを取得できます。私はそのリストをRecyclerViewの中にアダプターでマップします。私はそのリストを受け取るまでローディングビューを表示します。RecyclerViewのアイテムごとにネットワークからデータをロード

しかし、各行にアイテムごとに詳細情報を表示する必要がありますが、その商品のIDを送信する別のHTTPリクエスト(アイテムごと)でしか情報を取得できません。したがって、私はその情報を非同期に(行が表示されているとき)各行のUIに書きたいと思います。

これを実現するにはどうすればよいでしょうか?私はこれが非同期の画像読み込みと同じ問題だと思うので、ピカソやユニバーサル画像読み込みのようなライブラリをする必要があります。ではない?

私はそれを手助けするために任意の図書館を知っていますか?

ありがとうございます!

+0

行が表示されている場合に起動する、RecyclerViewエントリごとにAsyncTaskLoaderを使用できます。 –

+0

はい!とにかく、ViewHolderでビューの再利用を管理する必要があります。サービスが応答すると、ビューは再利用され、別のアイテムに関連付けられます。 – LopezAgrela

+0

静的ビューを使用している場合は、再利用が簡単です。 「クリックして表示」ビューがある場合は、どのような場合でもレンダリングする必要があります。 この操作を頻繁に行う場合は、開始時にnullで埋められる保持データ構造を考える必要があります(クリックでAsynctaskが発行されます)。既に対応する項目がダウンロードされている場合は、オブジェクトから)。 また、画像や動画が大きくない場合は、追加情報を最初から完全にダウンロードしてください。オーバーヘッドのように聞こえるかもしれませんが、時には以前よりも簡単で効率的になります。 –

答えて

1

これはRxJavaライブラリを使用して実現できます。たとえば、あなたはおそらくこのような何かをするだろうあなたのonBindViewHolder方法で:もちろん

Observable.fromCallable { 
    loadDataAsync(position, <other arguments you need>) 
}.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe { loadedData -> 
    holder.setAdditionalData(loadedData) 
} 

は、各サブスクリプションに追跡し、アイテムがメモリリークを防ぐために、リサイクルされた後に解除しなければなりません。

とにかく、あなたのAPI設計を改訂して、各アイテムに対して小さなHTTPリクエストをたくさん作成するのではなく、1回のリクエスト/応答サイクルですべてのデータを送信するようにしてください。この場合、問題は消えてしまいます。

+0

ありがとう!多分それはOKです。しかし、(ThreadPoolExecutorを使って)アクティブなネットワーク接続の数を制御したり、アイテムのデータがすでにリクエストされているかどうかをチェックしたり、キャッシュしたりするなど、もっと多くの管理が必要になると思います。したがって、マネージャを作成することは必須です。おそらくRxJavaは何の助けもしていないでしょう。 – LopezAgrela

関連する問題