[解決済み] Android用ローカル画像キャッシュソリューション。Square Picasso、Universal Image Loader、Glide、Fresco?
質問
Androidで非同期な画像読み込みとキャッシュを行うライブラリを探しています。Picassoを使おうと思っていたのですが、GitHubでUniversal Image Loaderの方が人気があることを知りました。この2つのライブラリについてご存知の方はいらっしゃいますか?長所と短所のまとめがあれば最高です。
(私の画像はすべてローカルディスクにあるので、ネットワークは必要ありません。したがって、Volleyが適合するとは思いません)
どのように解決するのですか?
2018年9月更新です。数年後、ローカル画像キャッシュソリューションにほぼ同じものが必要になりました。今回は、UILは積極的に開発されていません。私は人気のあるライブラリを比較し、結論はかなりノーブレーンです: Glideを使えばいいのです。Glideの方がずっと強力で、設定もしやすいからです。数年前、私はUILをフォークして変更を加えなければなりませんでした。Glideは、キャッシュ戦略やカスタムキーによる複数レベルの解像度キャッシュなど、私のすべてのユースケースをサポートしています。Glideを使うだけです!
Koushik Dutta の比較は、ほとんど速度ベンチマークのためのものです。彼の投稿は非常に基本的なことにしか触れておらず、ローカル画像に特化したものではありません。私が質問をした後、Picasso と UIL を使った私の経験を共有したいと思います。PicassoとUILはどちらもローカル画像を読み込むことができます。私は最初にPicassoを試して満足しましたが、その後、より多くのカスタマイズ オプションのためにUILに乗り換えることにしました。
Picassoです。
-
Picasso の流暢なインターフェイスは素敵です。しかし、"with", "into", "load" と飛び回るので、実際にはシーンの後ろに何があるのかわかりません。何が返されるのか混乱する。
-
Picassoでは、正確なターゲットサイズを指定することができます。これは、メモリの圧迫やパフォーマンスの問題がある場合に便利で、速度のためにある程度の画質をトレードオフすることができます。
-
画像はサイズをキーにキャッシュされ、異なるサイズの画像を表示するときに便利です。
-
メモリキャッシュのサイズをカスタマイズすることができます。しかし、そのディスク キャッシュは http リクエストのためだけのものです。ローカル画像の場合、読み込み速度を気にするならば、サムネイル ディスク キャッシュがあると、毎回画像のために数 MB を読み込む必要がなくて良いです。Picassoには、サムネイルをリサイズしてディスクに保存するこの仕組みがありません。
-
Picassoはそのキャッシュインスタンスへのアクセスを公開しません。(最初にPicassoを設定したときに取得して、それを維持することは可能です...)。
-
リスナーから返されたビットマップに、非同期で画像を読み込みたいことがあります。Picassoには、意外にもそれがありません。
-
Picassoはホームページにいくつかの簡単な例があるだけで、高度な使い方をするためには順序のないjavadocを読み通す必要があります。
UILです。
-
UILはカスタマイズにビルダーを使用しています。ほとんどすべての設定が可能です。
-
UILでは、ビューに読み込むサイズを指定することはできません。ビューのサイズに基づいたいくつかのルールを使用します。Picasso のような柔軟性はありません。メモリフットプリントを減らすために低解像度の画像を読み込む方法がないのです。(編集: この動作は、ソースコードにImageSizeの引数を追加することで簡単に変更でき、ビューサイズのチェックを回避できます)
-
UILはカスタマイズ可能なディスクキャッシュを提供しており、これを使用して指定されたサイズのサムネイルをキャッシュすることができます。しかし、それは完璧ではありません。以下は の詳細です。 . (編集: もしあなたが速度を気にし、私の場合のように複数レベルのサムネイル キャッシュが必要な場合は、ソース コードを修正してディスク キャッシュに "memoryKey" を使用させ、サイズも考慮させることができます)
-
UIL はデフォルトで、異なるサイズの画像をメモリにキャッシュします。
-
UIL は、アクセス可能なバッキングメモリとディスクキャッシュを公開します。
-
UILは、ビットマップを取得したり、ビューにロードするための柔軟な方法を提供します。
-
UILはドキュメントが優れています。UILはGithubのページで詳しい使い方を教えてくれるし、リンクされたチュートリアルもある。
Picassoから始めることをお勧めします。もし、より多くのコントロールとカスタマイズが必要であれば、UILをお勧めします。
関連
-
[解決済み] 深くネストされたスタックから離れるとき、Fragmentのバックスタックをクリーンアップする方法はこれで良いのでしょうか?
-
[解決済み] プログラム的に電話をかけるには?
-
[解決済み] HttpPostによる画像送信
-
[解決済み] CardView layout_width="match_parent "が親のRecyclerViewの幅と一致しない。
-
[解決済み] Androidでマイナスマージンを使用するのは悪いことですか?
-
[解決済み] XMLで矩形を描画できますか?
-
[解決済み] EditTextをReadOnlyにする
-
[解決済み] Gradleでビルドタイプを使用し、ContentProviderを使用する同じアプリを1つのデバイスで実行する。
-
[解決済み] BottomNavigationViewを新しいNavControllerで使用する際に、フラグメントを生かす方法はありますか?
-
[解決済み] ブルートゥースアプリケーションのテストにアンドロイドエミュレータを使用するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] CardView layout_width="match_parent "が親のRecyclerViewの幅と一致しない。
-
[解決済み] getApplication()、getApplicationContext()、getBaseContext()、someClass.thisの違いと使い分け。
-
[解決済み] アプリ内課金テスト:android.test.purchased already owned
-
[解決済み] これはどういうことですか?失敗 [INSTALL_FAILED_CONTAINER_ERROR]?
-
[解決済み] DialogFragmentを正しく終了させるには?
-
[解決済み] TabLayoutに対応したandroidデザインでタブテキストのフォントを変更する
-
[解決済み] AsyncTaskを複数回実行する
-
[解決済み] Android: ランドスケープモード用の代替レイアウト xml
-
[解決済み] TextView.setTextSizeの挙動がおかしい - テキストビューのテキストサイズを画面ごとに動的に設定する方法
-
[解決済み] Android: xml リソースからの整数値