オープンソース画像ロードフレームワーク-Universal-Image-Loader学習


紹介する
まず、その特性を見てみましょう.
構成可能度が高い.タスクスレッドプール、ダウンロード、デコーダ、メモリ、ディスクキャッシュ、表示オプションなどの構成をサポートします.
メモリキャッシュとディスクキャッシュの2つのレベルのキャッシュが含まれます.
マルチスレッドをサポートし、非同期および同期ロードをサポートします.
複数種類のキャッシュアルゴリズム、ダウンロード進捗リスニング、ListViewピクチャの乱れ解決などをサポートします.
使用
まず、Applicationで関連パラメータを構成して初期化する必要があります.もちろん、デフォルトの構成を構成する必要はありません.
public class MyApplication extends Application {  
  
    @Override  
    public void onCreate() {  
        super.onCreate();  
  
        //     ImageLoader      
        ImageLoaderConfiguration configuration = ImageLoaderConfiguration  
                .createDefault(this);  
          
        //         
        ImageLoader.getInstance().init(configuration);  
    }  
  
}  
File cacheDir = StorageUtils.getCacheDirectory(context);  
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)  
        .memoryCacheExtraOptions(480, 800) // default = device screen dimensions  
        .diskCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, 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)  
        .diskCacheFileCount(100)  
        .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default  
        .imageDownloader(new BaseImageDownloader(context)) // default  
        .imageDecoder(new BaseImageDecoder()) // default  
        .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default  
        .writeDebugLogs()  
        .build();

 パラメータ構成には、キャッシュポリシー、ロードスレッドプールのサイズなど、多くの構成可能な項目があります.自分のニーズに合わせて構成できます.ここでは説明しません.呼び出し方法を見てみましょう.フレームワークは、画像のロードを実現するための方法を提供しています.次に、いくつかの一般的な方法を見てみましょう.
loadImage()
final ImageView mImageView = (ImageView) findViewById(R.id.image);  
        String imageUrl = "https://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg";  
          
        ImageLoader.getInstance().loadImage(imageUrl, new ImageLoadingListener() {  
              
            @Override  
            public void onLoadingStarted(String imageUri, View view) {  
                  
            }  
              
            @Override  
            public void onLoadingFailed(String imageUri, View view,  
                    FailReason failReason) {  
                  
            }  
              
            @Override  
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {  
                mImageView.setImageBitmap(loadedImage);  
            }  
              
            @Override  
            public void onLoadingCancelled(String imageUri, View view) {  
                  
            }  
        });

この方法には2つのパラメータがあり、1つはurlで、1つはImageLoadingListenerで、ImageLoadingListenerコールバック方法は4つあり、ピクチャのロードが開始され、ピクチャのロードが失敗し、ピクチャのロードが完了し、ピクチャのロードがキャンセルされ、私たちは自分の必要に応じて対応する方法で自分のコードを書くことができます.もちろん、このような多くの方法が必要ではなく、ロードが完了するだけで表示される場合は、デフォルトのアダプタモードを使用しているSimpleImageLoadingListenerを伝えることができます.onLoadingCompleteメソッドが必要です.
final ImageView mImageView = (ImageView) findViewById(R.id.image);  
        String imageUrl = "https://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg";  
          
        ImageLoader.getInstance().loadImage(imageUrl, new SimpleImageLoadingListener(){  
  
            @Override  
            public void onLoadingComplete(String imageUri, View view,  
                    Bitmap loadedImage) {  
                super.onLoadingComplete(imageUri, view, loadedImage);  
                mImageView.setImageBitmap(loadedImage);  
            }  
              
        });

loadImageにはもう一つのリロード方法があり、画像のサイズをカスタマイズすることができます.私たちは自分でImageSizeオブジェクトをインスタンス化し、画像のサイズを設定して入力すればいいです.
final ImageView mImageView = (ImageView) findViewById(R.id.image);  
        String imageUrl = "https://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg";  
          
        ImageSize mImageSize = new ImageSize(100, 100);  
          
        ImageLoader.getInstance().loadImage(imageUrl, mImageSize, new SimpleImageLoadingListener(){  
  
            @Override  
            public void onLoadingComplete(String imageUri, View view,  
                    Bitmap loadedImage) {  
                super.onLoadingComplete(imageUri, view, loadedImage);  
                mImageView.setImageBitmap(loadedImage);  
            }  
              
        });

上は比較的簡単な使い方ですが、私たちは普段もっと複雑な使い方が必要です.loadImageには、私たちのニーズを満たすためのリロード方法があります.DisplayImageOptionsに転送して、画像のロード前に表示されたデフォルトのピクチャ、ロードに失敗した表示のピクチャ、キャッシュするかどうかなど、複雑なパラメータを構成することができます.
DisplayImageOptions options = new DisplayImageOptions.Builder()  
        .showImageOnLoading(R.drawable.ic_stub) // 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  
        .decodingOptions(...)  
        .displayer(new SimpleBitmapDisplayer()) // default  
        .handler(new Handler()) // default  
        .build();

彼の使い方は前の使い方と同じように、直接パラメータとして伝えればいいので、ここではコードを貼らない.
displayImage()
final ImageView mImageView = (ImageView) findViewById(R.id.image);  
        String imageUrl = "https://lh6.googleusercontent.com/-55osAWw3x0Q/URquUtcFr5I/AAAAAAAAAbs/rWlj1RUKrYI/s1024/A%252520Photographer.jpg";  
          
        //         
        DisplayImageOptions options = new DisplayImageOptions.Builder()  
                .showImageOnLoading(R.drawable.ic_stub)  
                .showImageOnFail(R.drawable.ic_error)  
                .cacheInMemory(true)  
                .cacheOnDisk(true)  
                .bitmapConfig(Bitmap.Config.RGB_565)  
                .build();  
          
        ImageLoader.getInstance().displayImage(imageUrl, mImageView, options);

コードから、displayImageメソッドは簡単で、Listenerインタフェースを入力する必要はなく、url、imageviewコントロール、optionsを入力するだけでよいことがわかります.この方法では、内部で表示する画像をクリップし、適切なサイズの画像を返します.画像のロード中に画像のロードの進捗状況が必要になることがあります.displayImageは、進捗状況を返すためにImageLoadingProgressListener()に転送されます.
imageLoader.displayImage(imageUrl, mImageView, options, new SimpleImageLoadingListener(), new ImageLoadingProgressListener() {  
              
            @Override  
            public void onProgressUpdate(String imageUri, View view, int current,  
                    int total) {  
                  
            }  
        });

ネットのピクチャーをロードする以外に、私达はまたローカルのピクチャーあるいはassetsをロードすることができて、drawableの中のピクチャー、このようにすれば私达はurlを変えるだけでいいです.例えば、ローカルのピクチャーをロードして私达はまずピクチャーの経路を知っていて、それからScheme.FILE.wrap(path)で包装して、同じassets、drawable、Scheme.ASSETS.wrap(path)を呼び出します;Scheme.DRAWABLE.wrap(path)この方法のソースコードを見てください.
 /** Represents supported schemes(protocols) of URI. Provides convenient methods for work with schemes and URIs. */
 public enum Scheme {
  HTTP("http"), HTTPS("https"), FILE("file"), CONTENT("content"), ASSETS("assets"), DRAWABLE("drawable"), UNKNOWN("");
  private String scheme;
  private String uriPrefix;
  Scheme(String scheme) {
   this.scheme = scheme;
   uriPrefix = scheme + "://";
  }

実はパッケージ後のパスには対応するファイル://が追加されています.
listviewではgridviewの中の画像のロードが一般的であることを知っています.listvewやgirdviewがスライドしている間に画像をロードしないことを望んでいます.私たちが止まったらロードします.フレームワークもこのような傍受を提供しています.
listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));  
gridView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));

pauseOnScroll、pauseOnFlingはbooleanタイプで、pauseOnScrollがtrueでスライドを表す場合はロードを一時停止し、pauseOnFlingでは激しいスライドプロセスでロードを停止します.
キャッシュポリシー
フレームワークはキャッシュ処理が行き届いており、キャッシュはメモリキャッシュとハードディスクキャッシュの2つに分けられています.まずメモリキャッシュを見てみましょう.メモリキャッシュにはLRU least recently usedの最近の最小使用アルゴリズムが使用されています.つまり、キャッシュスペースが私たちが設定したスペースサイズを超えた場合、フレームワークは最近の最小使用ビットマップをキャッシュから削除します.格納されている構造はチェーンテーブル構造に基づくLinkedHashMapです.もちろん、キャッシュポリシーをカスタマイズして、構成を初期化するときに設定することもできます.
メモリキャッシュには、強いリファレンスキャッシュ、弱いリファレンスキャッシュ、および両方を組み合わせたキャッシュポリシーが使用されます.強参照とは、オブジェクトを作成して変数を付与した場合、このオブジェクトはゴミ回収メカニズムによって回収されず、適時にOOMも回収されず、弱参照のオブジェクトが回収されることを意味します.
強引用のLruMemoryCacheを見てみましょう.このキャッシュクラスの内部ではLinkedHashMapが維持されています.キャッシュの最大値にmaxsizeを設定しました.キャッシュされた画像のサイズは計算されます.keyによると、この写真がキャッシュされている場合は、以前の写真を削除します.現在のキャッシュのサイズがmaxsizeより小さい場合は、操作しません.maxsizeより大きい場合は、最初のデータを削除します.
HDDキャッシュには、次のタイプがあります.
  • FileCountLimitedDiscCache(キャッシュ画像の個数を設定可能、設定値を超えると最初にハードディスクに追加するファイルを削除)
  • .
  • LimitedAgeDiscCache(ファイルが生存する最長時間を設定し、この値を超えるとファイルを削除する)
  • TotalSizeLimitedDiscCache(キャッシュbitmapの最大値を設定し、この値を超えると最初にハードディスクに追加されたファイルを削除)
  • UnlimitedDiscCache(このキャッシュクラスには何の制限もありません)
  • 上記のいくつかがあなたのプロジェクトのニーズに合わない場合は、構成をカスタマイズすることもできます.
     
     
    ImageLoaderについての勉強はここまでで、時間があればソースコードを見て、思いがけない収穫があるかもしれません.