English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Androidの画像キャッシュの原理、特性の比較

これは MDCC で共有した内容(少し変更されています)であり、ソースコード解析第一期が公開された時にも紹介されたソースコード解析の次にやることです。

いくつかの画像キャッシュを全体設計や原理の観点から比較し、その特性の実装について知りたい人はいません。

一. 四大画像キャッシュの基本情報


Universal ImageLoader は非常に早くオープンソースとしてリリースされた画像キャッシュで、初期には多くのアプリケーションで使用されていました。

Picasso は Square がオープンソースとしてリリースしたプロジェクトで、そのリーダーは JakeWharton であり、非常に有名です。

Glide は Google 厳員のオープンソースプロジェクトで、Google App によって使用されており、昨年の Google I/O 上で推奨されていますが、現在は国内の資料が少ないです。

Fresco は今年の前半に Facebook がオープンソースとしてリリースした画像キャッシュで、主な特徴には:
(1二つのメモリキャッシュとネイティブキャッシュを合わせて、三つのキャッシュが構成されています。

(2ストリーミングをサポートし、ウェブページ上のぼやけた徐々に画像を表示するように似たように表示できます。

(3多フレームアニメーション画像、例えば Gif、WebP などに対するサポートがより良いです。

Fresco がまだ正式リリースされていないため、 1バージョン、また Fresco ソースコードに詳しくないため、後の比較には含まれません。今後時間があれば比較に追加します。

さらに多くの画像キャッシュライブラリについては:Android 画像キャッシュライブラリ

二、基本概念

正式な比較を行う前に、いくつかの一般的な画像キャッシュの概念をまず理解しましょう:
(1リクエストマネージャー:リクエスト生成と管理モジュール

(2エンジン:タスク(データ取得)の作成と実行のスケジューリングを担当する部分です。

(3データゲットインターフェース:データ取得インターフェース、さまざまなデータソースからデータを取得する責任があります。
例えば、MemoryCache はメモリキャッシュからデータを取得し、DiskCache はローカルキャッシュからデータを取得し、ダウンロードャーはネットワークからデータを取得するなどです。

(4ディスプレイアー:リソース(画像)ディスプレイ、リソースの表示や操作に使用されます。
例えばImageView、これらの画像キャッシュはImageViewに限らず、他のViewおよび仮想のDisplayer概念もサポートしています。

(5) Processor リソース(画像)プロセッサ
リソース(例えば、回転、圧縮、切り取りなど)を処理する責任があります。

これらの概念の名称は、異なる画像キャッシュによって異なる場合があります。例えば、DisplayerはImageLoaderではImageAwareと呼ばれ、PicassoやGlideではTargetと呼ばれます。

三、共通の利点

1. 使用が簡単
画像の取得および表示を実現するためには、一つのコード文で十分です。

2. 高い設定可能度、高い適応性
画像のキャッシュのダウンローダー(リトライメカニズム)、デコーダ、ディスプレイ、プロセッサ、メモリキャッシュ、ローカルキャッシュ、スレッドプール、キャッシュアルゴリズムなどは、ほとんどが簡単に設定できます。

高い適応性を持って、システムのパフォーマンスに基づいてキャッシュの設定を初期化し、システム情報が変更された後に動的に戦略を調整します。
例えば、CPUのコア数に基づいて最大並行数を決定し、利用可能なメモリに基づいてメモリキャッシュのサイズを決定し、ネットワーク状態の変化に応じて最大並行数を調整するなどです。

3. 多レベルキャッシュ
少なくとも二つのレベルのキャッシュを持ち、画像の読み込み速度を向上させます。 

4. 複数のデータソースをサポート
ネットワーク、ローカル、リソース、Assetsなどの複数のデータソースをサポート

5. 複数のDisplayerをサポート
ImageViewに限らず、他のViewおよび仮想のDisplayer概念もサポートしています。

他にも小さな共通点として、アニメーションのサポート、transform処理のサポート、EXIF情報の取得などがあります。

四、ImageLoaderの設計および利点

1. 全体設計およびプロセス

これはImageLoaderの全体設計図です。このライブラリはImageLoaderEngine、CacheおよびImageDownloader、ImageDecoder、BitmapDisplayer、BitmapProcessorの五大モジュールに分かれています。CacheはMemoryCacheおよびDiskCacheの二つの部分に分かれています。

簡単に言えば、ImageLoaderが画像の読み込みおよび表示のタスクを受け取り、それをImageLoaderEngineに渡し、ImageLoaderEngineがタスクを具体的なスレッドプールに配分して実行します。タスクはCacheおよびImageDownloaderを通じて画像を取得し、途中でBitmapProcessorおよびImageDecoderが処理する可能性があります。最終的にはBitmapがBitmapDisplayerに渡され、ImageAware内で表示されます。

2ImageLoaderの利点

(1ダウンロード進捗の監視をサポートしています。

(2Viewのスクロール中に画像の読み込みを一時停止できる機能があります。
PauseOnScrollListenerインターフェースを使用して、Viewのスクロール中に画像の読み込みを一時停止できます。

(3デフォルトで複数のメモリキャッシュアルゴリズムを実装しています。これらの画像キャッシュはキャッシュアルゴリズムを設定できますが、ImageLoaderはデフォルトで多くのキャッシュアルゴリズムを実装しています。例えば、Size最大先削除、使用最少先削除、最近最少使用、先入先出削除、時間最長先削除などがあります。

(4ローカルキャッシュのファイル名規則の定義をサポートしています。

五、Picassoの設計および利点

1. 全体設計およびプロセス

上記はPicassoの全体設計図です。このライブラリはDispatcher、RequestHandler、Downloader、PicassoDrawableなどのモジュールに分かれています。

DispatcherはActionの配分および処理を担当し、提出、一時停止、再開、キャンセル、ネットワーク状態の変更、再試行などが含まれます。

簡単に言えば、Picassoが画像の読み込みおよび表示のタスクを受け取り、リクエストを作成し、それをDispatcherに渡します。Dispatcherはタスクを具体的なRequestHandlerに配分し、タスクはMemoryCacheおよびHandler(データ取得インターフェース)を通じて画像を取得し、画像の取得が成功するとPicassoDrawableを通じてTargetに表示されます。

上記のDataのFile system部分に注意が必要です。Picassoはカスタムローカルキャッシュのインターフェースを提供しておらず、デフォルトでHTTPのローカルキャッシュを使用します。 9 上記のokhttpを使用し、以下のUrlconnectionを使用するため、カスタムローカルキャッシュが必要な場合はDownloaderを再定義する必要があります。

2Picassoの利点

(1統計監視機能を内蔵しています。
画像キャッシュの使用を監視するサポート、キャッシュヒット率、使用中のメモリサイズ、節約されたトラフィックなどが含まれます。

(2) 优先順位処理をサポートしています。
タスクのスケジューリング前に優先度の高いタスクを選択します。例えば、AppページのBannerの優先度がアイコンよりも高い場合に非常に適用されます。

(3画像のサイズが計算され完了するまでの遅延をサポートしています。

(4フライトモードおよびネットワークタイプに応じた並行スレッド数をサポートしています。
モバイルデバイスがフライトモードに切り替えられたり、ネットワークタイプが変化した場合、自動的にスレッドプールの最大並行数を調整します。例えば、wifiの最大並行数は}} 4、 4g が 3、3g が 2
ここで Picasso はネットワークタイプに基づいて最大並行数を決定し、CPUコア数ではなくです。 

(5) 「ローカルキャッシュが無い」
「ローカルキャッシュが無い」というのは、Picassoがローカルキャッシュを実装していないのではなく、Squareの別のネットワークライブラリであるokhttpに依存していることを意味しています。この利点は、リクエストのレスポンスヘッダーからCacheを通じてキャッシュを利用できることです。-ControlおよびExpiredを使用して画像の有効期限を制御します。

六、Glide の設計および利点

1. 全体設計およびプロセス

これは Glide の全体設計図です。このライブラリは、RequestManager(リクエスト管理器)、Engine(データ取得エンジン)、Fetcher(データ取得器)、MemoryCache(メモリキャッシュ)、DiskLRUCache、Transformation(画像処理)、Encoder(ローカルキャッシュストレージ)、Registry(画像タイプおよび解析器設定)、Target(ターゲット)などのモジュールに分かれています。

簡単に言えば、Glide はリソースの読み込みおよび表示のタスクを受け取り、Request を作成し、それを RequestManager に渡します。Request は Engine を起動してデータソースからリソースを取得(Fetcher を通じて)、取得した後 Transformation を処理し、Target に渡します。

Glide は DiskLRUCache、GifDecoder などのオープンソースライブラリに依存してローカルキャッシュと Gif 画像のデコードを行います。

2. Glide の利点

(1) 画像キャッシュ->メディアキャッシュ
Glide は画像キャッシュだけでなく、Gif、WebP、サムネイルをサポートしています。さらに Video もサポートしているため、メディアキャッシュとしても使用できます。 

(2) 优先順位処理をサポートしています。

(3) Activity と保持します。/Fragmentのライフサイクルは一貫しており、trimMemoryをサポートします
Glide は各 context に対して RequestManager を保持し、FragmentTransaction を通じて Activity と保持します。/Fragment のライフサイクルは一貫しており、trimMemory インターフェースの実装が利用可能です。

(4) 支持しています。
Glide デフォルトで UrlConnection を通じてデータを取得し、okhttp や Volley と組み合わせて使用できます。実際には ImageLoader、Picasso も okhttp、Volley をサポートしています。

(5) メモリフレンドリー
① Glideのメモリキャッシュにはアクティブなデザインがあります
メモリキャッシュからデータを取得する際には、一般的な実装とは異なり、getを使用せずにremoveを使用し、そのキャッシュデータをソフトリファレンスの値がactiveResourcesマップであるというマップに追加し、参照カウントを数えます。画像の読み込みが完了した後、参照カウントが空であるかどうかを判断し、空であればリサイクルします。

② メモリキャッシュの画像は小さい
GlideはURL、view_width、view_height、スクリーンの解像度などを使用して統合キーとして、処理された画像をメモリキャッシュに保存し、元の画像ではなくサイズを節約します

③ Activityと/Fragmentのライフサイクルは一貫しており、trimMemoryをサポートします

④ 画像はデフォルトでデフォルトのRGB_を使用します565 ではなく、ARGB_888
クリア度は少し低いですが、画像が小さくなり、ARGB_に設定することもできます888

その他:Glideはsignatureを使用するか、ローカルキャッシュを使用しないことでURLの有効期限をサポートできます

7. 概要


これら3つを総じて見ると、ImageLoaderの機能と代理の理解が一般的に一般的です。 

Picassoのコードは一つのパッケージ内に存在し、厳格なパッケージの区別はありませんが、コードがシンプルで、論理が明確で、数時間で深く理解できます。

Glideは機能が強力ですが、コード量が多く、流れが複雑です。深く理解している場合にのみ推奨します。問題が発生した場合、解決が難しいです。

これでこの記事のすべての内容が終わります。皆様の学習に役立つことを願っています。また、ノイズ教材を多くのご支援をいただけますようにお願いします。

声明:この記事の内容はインターネットから取得しており、著作権者はすべての権利を保有しています。インターネットユーザーが自発的に貢献し、自己でアップロードしています。このサイトは所有権を持ちません。また、人工的な編集も行われていません。著作権侵害の疑いがある場合は、以下のメールアドレスにご連絡ください:notice#oldtoolbag.com(メール送信時は、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れたら、このサイトは直ちに侵害される内容を削除します。)

おすすめ