Android_开源框架_AndroidUniversalImageLoader网络图片加载
来源:互联网 发布:最准时时彩数据分析 编辑:程序博客网 时间:2024/05/17 03:20
1.功能概要
Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。
(1).使用多线程加载图片
(2).灵活配置ImageLoader的基本参数,包括线程数、缓存方式、图片显示选项等;
(3).图片异步加载缓存机制,包括内存缓存及SDCard缓存;
(4).采用监听器监听图片加载过程及相应事件的处理;
(5).配置加载的图片显示选项,比如图片的圆角处理及渐变动画。
2.简单实现
ImageLoader采用单例设计模式,ImageLoader imageLoader = ImageLoader.getInstance();得到该对象,每个ImageLoader采用单例设计模式,ImageLoader必须调用init()方法完成初始化。// 1.完成ImageLoaderConfiguration的配置 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this) .memoryCacheExtraOptions(480, 800) // default = device screen dimensions .discCacheExtraOptions(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 .discCache(new UnlimitedDiscCache(cacheDir))// default .discCacheSize(50 * 1024 * 1024) // 缓冲大小 .discCacheFileCount(100) // 缓冲文件数目 .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default .imageDownloader(new BaseImageDownloader(context)) // default .imageDecoder(new BaseImageDecoder()) // default .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default .writeDebugLogs() .build(); // 2.单例ImageLoader类的初始化 ImageLoader imageLoader = ImageLoader.getInstance(); imageLoader.init(config); // 3.DisplayImageOptions实例对象的配置 // 以下的设置再调用displayImage()有效,使用loadImage()无效 DisplayImageOptions options = new DisplayImageOptions.Builder() .showStubImage(R.drawable.ic_stub) // image在加载过程中,显示的图片 .showImageForEmptyUri(R.drawable.ic_empty) // empty URI时显示的图片 .showImageOnFail(R.drawable.ic_error) // 不是图片文件 显示图片 .resetViewBeforeLoading(false) // default .delayBeforeLoading(1000) .cacheInMemory(false) // default 不缓存至内存 .cacheOnDisc(false) // default 不缓存至手机SDCard .preProcessor(...) .postProcessor(...) .extraForDownloader(...) .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)// default .bitmapConfig(Bitmap.Config.ARGB_8888) // default .decodingOptions(...) .displayer(new SimpleBitmapDisplayer()) // default 可以设置动画,比如圆角或者渐变 .handler(new Handler()) // default .build(); // 4图片加载 // 4.1 调用displayImage imageLoader.displayImage( uri, /* 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 */ imageView, // 对应的imageView控件 options); // 与之对应的image显示方式选项 // 4.2 调用loadImage // 对于部分DisplayImageOptions对象的设置不起作用 imageLoader.loadImage( uri, options, new MyImageListener()); //ImageLoadingListener class MyImageListener extends SimpleImageLoadingListener{ @Override public void onLoadingStarted(String imageUri, View view) { imageView.setImageResource(R.drawable.loading); super.onLoadingStarted(imageUri, view); } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { imageView.setImageResource(R.drawable.no_pic); super.onLoadingFailed(imageUri, view, failReason); } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { imageView.setImageBitmap(loadedImage); super.onLoadingComplete(imageUri, view, loadedImage); } @Override public void onLoadingCancelled(String imageUri, View view) { imageView.setImageResource(R.drawable.cancel); super.onLoadingCancelled(imageUri, view); } }
3.支持的Uri
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)加载drawables下图片,可以通过ImageView.setImageResource(...) 而不是通过上面的ImageLoader.
4.缓冲至手机
DisplayImageOptions options = new DisplayImageOptions.Builder() ... .cacheInMemory(true) .cacheOnDisc(true) ... .build(); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) ... .defaultDisplayImageOptions(options) ... .build(); ImageLoader.getInstance().init(config); // Do it on Application start ImageLoader.getInstance().displayImage(imageUrl, imageView); /* 默认为defaultDisplayImageOptions设定的options对象,此处不用指定options对象 */
或者通过下面这种方式
DisplayImageOptions options = new DisplayImageOptions.Builder() ... .cacheInMemory(true) .cacheOnDisc(true) ... .build(); ImageLoader.getInstance().displayImage(imageUrl, imageView, options); //此处指定options对象由于缓存需要在外设中写入数据,故需要添加下面的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
5.OutOfMemoryError
(1).减少configuration中线程池的线程数目(.threadPoolSize(...)) 推荐为1 - 5
(2).display options通过.bitmapConfig(Bitmap.Config.RGB_565)设置. Bitmaps in RGB_565 consume 2 times less memory than in ARGB_8888.
(3).使用configuration的memoryCache(new WeakMemoryCache())方法 或者不调用.cacheInMemory()方法
(4).display options通过.imageScaleType(ImageScaleType.IN_SAMPLE_INT) 或者 .imageScaleType(ImageScaleType.EXACTLY)方法
(4).避免使用RoundedBitmapDisplayer,它创建了一个新的ARGB_8888 Bitmap对象
6.内存缓存管理
通过imageLoaderConfiguration.memoryCache([new LruMemoryCache(1)]))对手机内存缓存进行管理
LruMemoryCache
API >= 9默认.it is moved to the head of a queue.
FreqLimitedMemoryCache
当超过缓存大小后,删除最近频繁使用的bitmap
LRULimitedMemoryCache
API < 9 默认.当超过缓存大小后,删除最近使用的bitmap
FIFOLimitedMemoryCache
FIFO rule is used for deletion when cache size limit is exceeded
LargestLimitedMemoryCache
The largest bitmap is deleted when cache size limit is exceeded
WeakMemoryCache
Unlimited cache
7.SDcard缓存管理
通过imageLoaderConfiguration.discCache([new TotalSizeLimitedDiscCache()]))对SD卡缓存进行管理
UnlimitedDiscCache
default The fastest cache, doesn't limit cache size
TotalSizeLimitedDiscCache
Cache limited by total cache size. If cache size exceeds specified limit then file with themost oldest lastusage date will be deleted
FileCountLimitedDiscCache
Cache limited by file count. If file count in cache directory exceeds specified limit then file with the most oldest last usage date will be deleted.
LimitedAgeDiscCache
Size-unlimited cache with limited files' lifetime. If age of cached file exceeds defined limit then it will be deleted from cache.
UnlimitedDiscCache is 30%-faster than other limited disc cache implementations.
使用开源imageLoader优化listview加载大量本地图片的demo-->
package com.example.listviewdemo;import java.util.ArrayList;import java.util.Collections;import java.util.LinkedList;import java.util.List;import android.database.Cursor;import android.graphics.Bitmap;import android.os.Bundle;import android.provider.MediaStore;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import com.nostra13.universalimageloader.core.DisplayImageOptions;import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;import com.smalt.smaltmap.utils.GlobalConstant;/** * * @Title: * @Description:ListView显示大量图片 * @Copyright: Copyright (c) 2014 * @Company: * @author: Administrator * @version: 1.0.0.0 * @Date: 2014-2-14 */public class MainActivity01 extends AbsListViewBaseActivity {DisplayImageOptions options; // 配置图片加载及显示选项ListView lvShow;/** * 存储图片地址 */ArrayList<String> listImgPath;String[] imageUriArray;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lvShow = (ListView) findViewById(R.id.lv_show);// 扫描内存中图片并存入listlistImgPath = getImgPathList();if (listImgPath.size() < 1) {GlobalConstant.i("sd卡中无图片");} else {// list转成数组imageUriArray = (String[]) listImgPath.toArray(new String[listImgPath.size()]);// 配置图片加载及显示选项(还有一些其他的配置,查阅doc文档吧)options = new DisplayImageOptions.Builder().showStubImage(R.drawable.ic_launcher) // 在ImageView加载过程中显示图片.showImageForEmptyUri(R.drawable.ic_launcher) // image连接地址为空时.showImageOnFail(R.drawable.ic_launcher) // image加载失败.cacheInMemory(true) // 加载图片时会在内存中加载缓存.cacheOnDisc(true) // 加载图片时会在磁盘中加载缓存.displayer(new RoundedBitmapDisplayer(20)) // 设置用户加载图片task(这里是圆角图片显示).build();// 加载适配器lvShow.setAdapter(new AdapterList());}}@Overridepublic void onBackPressed() {AnimateFirstDisplayListener.displayedImages.clear();super.onBackPressed();}/** * * 获取图片地址列表 * * @return list */private ArrayList<String> getImgPathList() {ArrayList<String> list = new ArrayList<String>();Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,new String[] { "_id", "_data" }, null, null, null);while (cursor.moveToNext()) {list.add(cursor.getString(1));// 将图片路径添加到list中}cursor.close();return list;}/** 图片加载监听事件 **/private static class AnimateFirstDisplayListener extendsSimpleImageLoadingListener {static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());@Overridepublic 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); // 设置image隐藏动画500msdisplayedImages.add(imageUri); // 将图片uri添加到集合中}}}}/** * * @Title: * @Description:listview适配器 * @Copyright: Copyright (c) 2014 * @Company: * @author: Administrator * @version: 1.0.0.0 * @Date: 2014-2-14 */class AdapterList extends BaseAdapter {private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();@Overridepublic int getCount() {// TODO Auto-generated method stubreturn imageUriArray.length;}/** * 构造方法 */public AdapterList() {// TODO Auto-generated constructor stub}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn arg0;}/* * (non-Javadoc) * * @see android.widget.Adapter#getItemId(int) */@Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn arg0;}/* * (non-Javadoc) * * @see android.widget.Adapter#getView(int, android.view.View, * android.view.ViewGroup) */@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {holder = new ViewHolder();// 初始化绑定控件convertView = getLayoutInflater().inflate(R.layout.layout_item, null);holder.imgShow = (ImageView) findViewById(R.id.img_show);holder.tvShow = (TextView) findViewById(R.id.tv_show);// add to convertViewconvertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}// 设置img,text具体显示的内容holder.tvShow.setText("fuck" + (position));imageLoader.displayImage(imageUriArray[position], holder.imgShow,options, animateFirstListener);return convertView;}}static class ViewHolder {ImageView imgShow;TextView tvShow;}}
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- **Android_开源框架_AndroidUniversalImageLoader网络图片加载**
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- Android_图片加载框架---ImageLoader
- 开源框架_AndroidUniversalImageLoader使用详解
- Android开源框架--AndroidUniversalImageLoader网络图片加载
- Android开源框架Universal-Image-Load网络图片加载
- Android_网络框架--Retrofit
- 最近学的东西是该总结一下了
- uva 10163 dp
- DirectX3D游戏开发七 backface culling(背面剔除)
- 算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)
- ssh远程登录服务器时提示'Permission denied (publickey)'的解决办法
- Android_开源框架_AndroidUniversalImageLoader网络图片加载
- TCP/IP七层协议详解
- ssh 不用密码
- apache和tomcat的区别
- sys密码格式导致OEM备份及数据泵报错
- 听故事学Swift系列 - 小明与红包(optionals - 可选类型)
- JSON数据的解析
- 文件xls与xlsx解析式遇到的bug
- 公钥与私钥