当前位置: 代码迷 >> 综合 >> Android之Universal-Image-Loader(简介)
  详细解决方案

Android之Universal-Image-Loader(简介)

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

二.具体应用:

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

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

<span style="font-size:18px;">public class BaseActivity extends Activity {ImageLoader imageLoader;@Overrideprotected void onCreate(Bundle savedInstanceState) {// Create global configuration and initialize ImageLoader with this configurationImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()).build();ImageLoader.getInstance().init(config);super.onCreate(savedInstanceState);}
}</span>

<span style="font-size:18px;">public class MainActivity extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ImageLoader imageLoader = ImageLoader.getInstance();GridView gridView = (GridView) this.findViewById(R.id.grdvImageWall);gridView.setAdapter(new PhotoWallAdapter(Constants.IMAGES));}static class ViewHolder {ImageView imageView;ProgressBar progressBar;}public class PhotoWallAdapter extends BaseAdapter {String[] imageUrls;ImageLoader imageLoad;DisplayImageOptions options;LinearLayout gridViewItem;public PhotoWallAdapter(String[] imageUrls) {assert imageUrls != null;this.imageUrls = imageUrls;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.considerExifParams(false) // default.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default.bitmapConfig(Bitmap.Config.ARGB_8888) // default.displayer(new SimpleBitmapDisplayer()) // default.handler(new Handler()) // default.build();this.imageLoad = ImageLoader.getInstance();}@Overridepublic int getCount() {return this.imageUrls.length;}@Overridepublic Object getItem(int position) {if (position <= 0 || position >= this.imageUrls.length) {throw new IllegalArgumentException("position<=0||position>=this.imageUrls.length");}return this.imageUrls[position];}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// 判断这个image是否已经在缓存当中,如果没有就下载final ViewHolder holder;if (convertView == null) {holder = new ViewHolder();gridViewItem = (LinearLayout) getLayoutInflater().inflate(R.layout.image_wall_item, null);holder.imageView = (ImageView) gridViewItem.findViewById(R.id.item_image);holder.progressBar = (ProgressBar) gridViewItem.findViewById(R.id.item_process);gridViewItem.setTag(holder);convertView = gridViewItem;} else {holder = (ViewHolder) gridViewItem.getTag();}this.imageLoad.displayImage(this.imageUrls[position],holder.imageView, options,new SimpleImageLoadingListener() {@Overridepublic void onLoadingStarted(String imageUri, View view) {holder.progressBar.setProgress(0);holder.progressBar.setVisibility(View.VISIBLE);}@Overridepublic void onLoadingFailed(String imageUri, View view,FailReason failReason) {holder.progressBar.setVisibility(View.GONE);}@Overridepublic void onLoadingComplete(String imageUri,View view, Bitmap loadedImage) {holder.progressBar.setVisibility(View.GONE);}}, new ImageLoadingProgressListener() {@Overridepublic void onProgressUpdate(String imageUri,View view, int current, int total) {holder.progressBar.setProgress(Math.round(100.0f* current / total));}}); // 通过URL判断图片是否已经下载return convertView;}}
}</span>


三者的关系

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

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

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

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























  相关解决方案