一、介绍
Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示,该库的特点如下:
1、多线程图片加载
2、尽可能多的配置选项(线程池,加载器,解析器,内存/磁盘缓存,显示参数等等)
3、图片可以缓存在内存中,或者设备文件目录下,或者SD卡中
4、可以监听加载进度
5、可以自定义显示每一张图片时都带不同参数
6、支持Widget
二、流程图
借鉴一下别人的图
三、使用步骤
1、配置AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2、Application中初始化类ImageLoaderConfiguration
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.diskCacheExtraOptions(480, 800, null)
.taskExecutor(...)
.taskExecutorForCachedImages(...)
.threadPoolSize(3) //设置线程池的大小,池的大小决定能同时运行的线程数
.threadPriority(Thread.NORM_PRIORITY - 1)//设置正在运行任务的所有线程在系统中的优先级
.tasksProcessingOrder(QueueProcessingType.FIFO)
.denyCacheImageMultipleSizesInMemory()//强制UIL在内存中不能存储内容相同但大小不同的图像
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))//指定内存缓存的实现
.memoryCacheSize(2 * 1024 * 1024)//设置内存缓存的最大占用空间
.memoryCacheSizePercentage(13)
.diskCache(new UnlimitedDiscCache(cacheDir))//定义自己的磁盘缓存
.diskCacheSize(50 * 1024 * 1024)
.diskCacheFileCount(100)
.diskCacheFileNameGenerator(new Md5FileNameGenerator())//将保存的时候的URI名称用MD5加密
.imageDownloader(new BaseImageDownloader(context))
.imageDecoder(new BaseImageDecoder())
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.writeDebugLogs()
.build();
ImageLoader.getInstance().init(config);
3、在Activity中实现
public class ListViewActivity extends Activity{
private MyListView myListview = null;
// private List<Map<String, Object>> mList=new ArrayList<Map<String,Object>>();
private DisplayImageOptions options;
String[] mImageUrls = Constants.IMAGES;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub)
.showImageForEmptyUri(R.drawable.ic_empty)
.showImageOnFail(R.drawable.ic_error)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.displayer(new RoundedBitmapDisplayer(20))
.build();
setContentView(R.layout.listview_main);
myListview = (MyListView)findViewById(R.id.listview);
MyAdapter adapter = new MyAdapter(this);
myListview.setAdapter(adapter);
}
@Override
public void onDestroy() {
super.onDestroy();
AnimateFirstDisplayListener.displayedImages.clear();
}
public class MyAdapter extends BaseAdapter{
private LayoutInflater mInflater;
private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
public MyAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mImageUrls.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder hold = null;
if(convertView == null){
hold = new ViewHolder();
convertView = mInflater.inflate(R.layout.list_item, null);
hold.item_image = (ImageView)convertView.findViewById(R.id.list_image);
hold.item_title = (TextView)convertView.findViewById(R.id.list_title);
hold.item_content = (TextView)convertView.findViewById(R.id.list_content);
convertView.setTag(hold);
}else{
hold = (ViewHolder)convertView.getTag();
}
//mImageUrls[position]是图片的url,hold.item_image是控件
/*除了使用网络图片,还可以使用本地图片url如下:
* String imageUri = "http://site.com/image.png"; // from Web
* String imageUri = "file:///mnt/sdcard/image.png"; // from SD card
* String imageUri = "content://media/external/audio/albumart/13"; // from content provider
* String imageUri = "assets://image.png"; // from assets
* String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)
*/
ImageLoader.getInstance().displayImage(mImageUrls[position], hold.item_image, options, animateFirstListener);
hold.item_title.setText("title " + (position + 1));
hold.item_content.setText("content " + (position + 1));
return convertView;
}
public final class ViewHolder {
public TextView item_title;
public TextView item_content;
public ImageView item_image;
}
}
private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {
static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if (loadedImage != null) {
ImageView imageView = (ImageView) view;
boolean firstDisplay = !displayedImages.contains(imageUri);
if (firstDisplay) {
FadeInBitmapDisplayer.animate(imageView, 500);
displayedImages.add(imageUri);
}
}
}
}
}