AndroidオープンソースフレームワークUniversal-Image-Loader解析


最近会社で物を分かち合うことを要して、多くのプロジェクトの中でUniversal-Image-Loaderというオープンソースのフレームワークを使って、あまり多くのプロセスのスケジューリングがなくて、各種のメモリの読み取りの制御のメカニズムがなくて、各種の異常な処理がなくて、いっしょに勉強します
1.UIL原理
a.UI:データを要求し、唯一のKey値を使用してMemory CacheのBitmapをインデックスする.
b.メモリキャッシュ:キャッシュ検索を行い、Key値に対応するBitmapが見つかればデータを返す.そうでなければcを実行します.
c.ハードディスクストレージ:一意キー値に対応するファイル名を使用して、SDCard上のファイルを取得する.対応するファイルがある場合はBitmapFactoryを使用します.decode*メソッドでは、Bitmapを復号してデータを返し、キャッシュにデータを書き込みます.対応するファイルがない場合は、dを実行します.
d.画像のダウンロード:非同期スレッドを起動し、データソースからデータ(Web)をダウンロードする.
e.ダウンロードに成功した場合、データをハードディスクとキャッシュに同時に書き込み、BitmapをUIに表示します.
2.UILフィーチャー
マルチスレッドダウンロード画像
ImageLoaderの任意の構成
二次キャッシュのサポート
ファイルシステム、assets、drawableなどの画像のロードをサポート
画像ダウンロードプロセスの傍受をサポート
...
特徴が多いので、ここでは一つ一つ挙げません
3.UIL解析
ImageLoaderConfigurationは、ピクチャキャッシュのグローバル構成であり、主に有線クラス、キャッシュサイズ、ディスクサイズ、ピクチャダウンロードと解析、ログの構成である.
ImageLoaderは、具体的なダウンロード画像、キャッシュ画像、表示画像の具体的な実行クラスであり、displayImage(...)、loadImage(...),でも結局彼らの実現はすべてdisplayImage(...)
DisplayImageOptionsは、各Imageloaderがネットワークピクチャの状態(空白、ダウンロードエラー、ダウンロード中)に応じて対応するピクチャを表示し、キャッシュをディスクにロードするか、ダウンロード後にピクチャをどのように処理するかを指導するために使用される.
4.ImageLoaderConfiguration構成
  ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this);
                                            <span style="font-family:     ,   , Arial;">ImageLoader.getInstance().init(configuration);</span>

createDefault()メソッドを使用して、デフォルトのImageLoaderConfifurationを作成しました.
1.メモリキャッシュを開き、圧縮された画像のサイズは画面の幅と高さである.
2.ハードディスクキャッシュを開き、画像を圧縮しない
3.デフォルトのスレッドプールは3
4.異なるサイズの画像のキャッシュを許可する
5.デフォルトのFIFO処理タスクの使用
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
        .memoryCacheExtraOptions(480, 800) // default = device screen dimensions
        .diskCacheExtraOptions(480, 800, null)
        .taskExecutor(...)
        .taskExecutorForCachedImages(...)
        .threadPoolSize(3) // default
        .threadPriority(Thread.NORM_PRIORITY - 1) // default
        .tasksProcessingOrder(QueueProcessingType.FIFO) // default
        .denyCacheImageMultipleSizesInMemory()
        .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
        .memoryCacheSize(2 * 1024 * 1024)
        .memoryCacheSizePercentage(13) // default
        .diskCache(new UnlimitedDiscCache(cacheDir)) // default
        .diskCacheSize(50 * 1024 * 1024)
以上はデフォルトの構成に対応しており、デフォルトの構成があなたの要求を満たしていない場合は、自分で変更することができます.
5.DisplayImageOptions構成(必要に応じて変更)
DisplayImageOptions options = new DisplayImageOptions.Builder()
        .showImageOnLoading(R.drawable.ic) // resource or drawable
        .showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable
        .showImageOnFail(R.drawable.ic_error) // resource or drawable
        .resetViewBeforeLoading(false)  // default
        .delayBeforeLoading(1000)
        .cacheInMemory(false) // default
        .cacheOnDisk(false) // default
        .preProcessor(...)
        .postProcessor(...)
        .extraForDownloader(...)
        .considerExifParams(false) // default
        .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
        .bitmapConfig(Bitmap.Config.ARGB_8888) // default

1.ネットワーク状況に応じて画像状態を設定する(空白、ダウンロードエラー、ダウンロード中)
2.画像読み込み完了後にviewをリセットするか
3.ダウンロード遅延時間の設定
4.メモリまたはHDDにキャッシュするかどうか
5.ダウンロード完了後の画像処理
6.ImageLoader
ImageLoaderには2つの具体的な方法があり、loadImage()とdisplayImage()は、プロジェクトではdisplayImage()の方法を直接使用するのが一般的で便利です
ImageLoader.getInstance().displayImage(imageUrl, mImageView, options);

7.その他のソースの画像をロードする
他のソースの画像をロードする場合はurlを変更するだけです
content providerピクチャString contentprividerUrl="をロードcontent://media/external/audio/albumart/13"
assetsピクチャString assetsUrl=Schemeをロードします.ASSETS.wrap("image.png");  
drawableピクチャString drawableUrl=Schemeをロードします.DRAWABLE.wrap("R.drawable.image")
8.UILメモリキャッシュポリシー
1.強参照キャッシュのみ使用
LruMemoryCache(このクラスはこのオープンソースフレームワークのデフォルトのメモリキャッシュクラスで、bitmapの強い参照をキャッシュしています.次はソースコードからこのクラスを分析します)
  2.強いリファレンスと弱いリファレンスを組み合わせたキャッシュには
UsingFreqLimitedMemoryCache(キャッシュされたピクチャの総量が制限値を超える場合は、使用頻度が最も小さいbitmapを削除します)
LRULimitedMemoryCache(これも使用するlruアルゴリズムですが、LruMemoryCacheとは異なり、彼がキャッシュしているのはbitmapの弱い参照です)
FIFOLimitedMemoryCache
LargestLimitedMemoryCache(キャッシュ制限値を超えると、最大のbitmapオブジェクトを削除します)
LimitedAgeMemoryCache(bitmapがキャッシュに追加された時間が私たちが設定した値を超えた場合、削除します)
  3.弱いリファレンスキャッシュのみを使用
WeakMemoryCache(このクラスのキャッシュbitmapの総サイズに制限はなく、唯一の不足点は不安定で、キャッシュされた画像が回収されやすい)
9.UILハードディスクキャッシュポリシー
FileCountLimitedDiscCache
TotalSizeLimitedDiscCache(キャッシュbitmapの最大値を設定し、この値を超えると最初にハードディスクに追加されたファイルを削除)
UnlimitedDiscCache(このキャッシュクラスには何の制限もありません)注:UILデフォルトメモリキャッシュで使用されるLruMemoryCache、デフォルトハードディスクキャッシュで使用されるUnlimitedDiscCache
10.UILがOOMを回避する方法
1.スレッドプールの数を減らし、ImageLoaderConfiguration(.threadPoolSize)で構成します.デフォルトは3です.
2.DisplayImageOptionsオプションでbitmapConfigをBitmapに設定.Config.RGB_565、デフォルトはARGB_ですので8888、RGB_を使用565はARGBを使うよりも8888メモリ消費量を2倍削減
3.ImageLoaderConfigurationで画像を構成するメモリキャッシュはmemoryCache(new WeakMemoryCache)またはメモリキャッシュを使用しない
4.DisplayImageOptionsオプションで設定.imageScaleType(ImageScaleType.IN_SAMPLE_INT)またはimageScaleType(ImageScaleType.EXACTLY)