Android-Universal-Image-Loader三大组件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration详解

一、介绍

Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。所以,如果你的程序里需要这个功能的话,那么不妨试试它。因为已经封装好了一些类和方法。我们 可以直接拿来用了。而不用重复去写了。其实,写一个这方面的程序还是比较麻烦的,要考虑多线程缓存,内存溢出等很多方面。

二、具体使用

一个好的类库的重要特征就是可配置性强。我们先简单使用Android-Universal-Image-Loader,一般情况下使用默认配置就可以了。

下面的实例利用Android-Universal-Image-Loader将网络图片加载到图片墙中。

1publicclassBaseActivityextendsActivity {2ImageLoaderimageLoader;3@Override4protectedvoidonCreate(Bundle savedInstanceState) {5//Create global configuration and initialize ImageLoader with this configuration6ImageLoaderConfigurationconfig =newImageLoaderConfiguration.Builder(getApplicationContext())7.build();8ImageLoader.getInstance().init(config);9super.onCreate(savedInstanceState);10}11}

1publicclassMainActivityextendsBaseActivity {23@Override4protectedvoidonCreate(Bundle savedInstanceState) {5super.onCreate(savedInstanceState);6setContentView(R.layout.activity_main);78ImageLoaderimageLoader =ImageLoader.getInstance();910GridView gridView = (GridView)this.findViewById(R.id.grdvImageWall);11gridView.setAdapter(newPhotoWallAdapter(Constants.IMAGES));12}1314staticclassViewHolder {15ImageView imageView;16ProgressBar progressBar;17}1819publicclassPhotoWallAdapterextendsBaseAdapter {20String[] imageUrls;21ImageLoader imageLoad;22DisplayImageOptionsoptions;23LinearLayout gridViewItem;2425publicPhotoWallAdapter(String[] imageUrls) {26assertimageUrls !=null;27this.imageUrls =imageUrls;2829options =newDisplayImageOptions.Builder()30.showImageOnLoading(R.drawable.ic_stub)//resource or31//drawable32.showImageForEmptyUri(R.drawable.ic_empty)//resource or33//drawable34.showImageOnFail(R.drawable.ic_error)//resource or35//drawable36.resetViewBeforeLoading(false)//default37.delayBeforeLoading(1000).cacheInMemory(false)//default38.cacheOnDisk(false)//default39.considerExifParams(false)//default40.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)//default41.bitmapConfig(Bitmap.Config.ARGB_8888)//default42.displayer(newSimpleBitmapDisplayer())//default43.handler(newHandler())//default44.build();45this.imageLoad =ImageLoader.getInstance();4647}4849@Override50publicintgetCount() {51returnthis.imageUrls.length;52}5354@Override55publicObject getItem(intposition) {56if(position <= 0 || position >=this.imageUrls.length) {57thrownewIllegalArgumentException(58"position<=0||position>=this.imageUrls.length");59}60returnthis.imageUrls[position];61}6263@Override64publiclonggetItemId(intposition) {65returnposition;66}6768@Override69publicView getView(intposition, View convertView, ViewGroup parent) {70//判断这个image是否已经在缓存当中,如果没有就下载71finalViewHolder holder;72if(convertView ==null) {73holder =newViewHolder();74gridViewItem =(LinearLayout) getLayoutInflater().inflate(75R.layout.image_wall_item,null);76holder.imageView =(ImageView) gridViewItem77.findViewById(R.id.item_image);78holder.progressBar =(ProgressBar) gridViewItem79.findViewById(R.id.item_process);80gridViewItem.setTag(holder);81convertView =gridViewItem;82}else{83holder =(ViewHolder) gridViewItem.getTag();84}85this.imageLoad.displayImage(this.imageUrls[position],86holder.imageView, options,87newSimpleImageLoadingListener() {8889@Override90publicvoidonLoadingStarted(String imageUri, View view) {91holder.progressBar.setProgress(0);92holder.progressBar.setVisibility(View.VISIBLE);93}9495@Override96publicvoidonLoadingFailed(String imageUri, View view,97FailReason failReason) {98holder.progressBar.setVisibility(View.GONE);99}100101@Override102publicvoidonLoadingComplete(String imageUri,103View view, Bitmap loadedImage) {104holder.progressBar.setVisibility(View.GONE);105}106107},newImageLoadingProgressListener() {108109@Override110publicvoidonProgressUpdate(String imageUri,111View view,intcurrent,inttotal) {112holder.progressBar.setProgress(Math.round(100.0f113* current /total));114}115});//通过URL判断图片是否已经下载116returnconvertView;117}118119}120}

里面主要的对象都用突出显示了。

三者的关系

ImageLoaderConfiguration是针对图片缓存的全局配置,主要有线程类、缓存大小、磁盘大小、图片下载与解析、日志方面的配置。

ImageLoader是具体下载图片,缓存图片,显示图片的具体执行类,它有两个具体的方法displayImage(...)、loadImage(...),但是其实最终他们的实现都是displayImage(...)。

DisplayImageOptions用于指导每一个Imageloader根据网络图片的状态(空白、下载错误、正在下载)显示对应的图片,是否将缓存加载到磁盘上,下载完后对图片进行怎么样的处理。

从三者的协作关系上看,他们有点像厨房规定、厨师、客户个人口味之间的关系。ImageLoaderConfiguration就像是厨房里面的规定,每一个厨师要怎么着装,要怎么保持厨房的干净,这是针对每一个厨师都适用的规定,而且不允许个性化改变。ImageLoader就像是具体做菜的厨师,负责具体菜谱的制作。DisplayImageOptions就像每个客户的偏好,根据客户是重口味还是清淡,每一个imageLoader根据DisplayImageOptions的要求具体执行。

ImageLoaderConfiguration

在上面的示例代码中,我们使用ImageLoaderConfiguration的默认配置,下面给出ImageLoaderConfiguration比较详尽的配置,从下面的配置中,可以看出ImageLoaderConfiguration的配置主要是全局性的配置,主要有线程类、缓存大小、磁盘大小、图片下载与解析、日志方面的配置。

ImageLoaderConfiguration config =newImageLoaderConfiguration.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(newLruMemoryCache(2 * 1024 * 1024))

.memoryCacheSize(2 * 1024 * 1024)

.memoryCacheSizePercentage(13)//default.diskCache(newUnlimitedDiscCache(cacheDir))//default.diskCacheSize(50 * 1024 * 1024)

.diskCacheFileCount(100)

.diskCacheFileNameGenerator(newHashCodeFileNameGenerator())//default.imageDownloader(newBaseImageDownloader(context))//default.imageDecoder(newBaseImageDecoder())//default.defaultDisplayImageOptions(DisplayImageOptions.createSimple())//default.writeDebugLogs()

.build();

ImageLoaderConfiguration的主要职责就是记录相关的配置,它的内部其实就是一些字段的集合(如下面的源代码)。它有一个builder的内部类,这个类中的字段跟ImageLoaderConfiguration中的字段完全一致,它有一些默认值,通过修改builder可以配置ImageLoaderConfiguration。

View Code

Display Options

每一个ImageLoader.displayImage(...)都可以使用Display Options

DisplayImageOptions options =newDisplayImageOptions.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(newSimpleBitmapDisplayer())//default.handler(newHandler())//default.build();

Display Options的主要职责就是记录相关的配置,它的内部其实就是一些字段的集合(如下面的源代码)。它有一个builder的内部类,这个类中的字段跟DisplayOption中的字段完全一致,它有一些默认值,通过修改builder可以配置DisplayOptions。

你可能感兴趣的:(Android-Universal-Image-Loader三大组件DisplayImageOptions、ImageLoader、ImageLoaderConfiguration详解)