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

本文详细介绍了Android-Universal-Image-Loader的三个核心组件:DisplayImageOptions、ImageLoader及ImageLoaderConfiguration。通过示例展示了如何配置和使用这些组件来实现图片的异步加载、缓存及显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

1 public class BaseActivity extends Activity {
2 ImageLoader imageLoader;
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 // Create global configuration and initialize ImageLoader with this configuration
6 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
7 .build();
8 ImageLoader.getInstance().init(config);
9 super.onCreate(savedInstanceState);
10 }
11 }

复制代码
复制代码

1 public class MainActivity extends BaseActivity {
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.activity_main);
7
8 ImageLoader imageLoader = ImageLoader.getInstance();
9
10 GridView gridView = (GridView) this.findViewById(R.id.grdvImageWall);
11 gridView.setAdapter(new PhotoWallAdapter(Constants.IMAGES));
12 }
13
14 static class ViewHolder {
15 ImageView imageView;
16 ProgressBar progressBar;
17 }
18
19 public class PhotoWallAdapter extends BaseAdapter {
20 String[] imageUrls;
21 ImageLoader imageLoad;
22 DisplayImageOptions options;
23 LinearLayout gridViewItem;
24
25 public PhotoWallAdapter(String[] imageUrls) {
26 assert imageUrls != null;
27 this.imageUrls = imageUrls;
28
29 options = new DisplayImageOptions.Builder()
30 .showImageOnLoading(R.drawable.ic_stub) // resource or
31 // drawable
32 .showImageForEmptyUri(R.drawable.ic_empty) // resource or
33 // drawable
34 .showImageOnFail(R.drawable.ic_error) // resource or
35 // drawable
36 .resetViewBeforeLoading(false) // default
37 .delayBeforeLoading(1000).cacheInMemory(false) // default
38 .cacheOnDisk(false) // default
39 .considerExifParams(false) // default
40 .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
41 .bitmapConfig(Bitmap.Config.ARGB_8888) // default
42 .displayer(new SimpleBitmapDisplayer()) // default
43 .handler(new Handler()) // default
44 .build();
45 this.imageLoad = ImageLoader.getInstance();
46
47 }
48
49 @Override
50 public int getCount() {
51 return this.imageUrls.length;
52 }
53
54 @Override
55 public Object getItem(int position) {
56 if (position <= 0 || position >= this.imageUrls.length) {
57 throw new IllegalArgumentException(
58 “position<=0||position>=this.imageUrls.length”);
59 }
60 return this.imageUrls[position];
61 }
62
63 @Override
64 public long getItemId(int position) {
65 return position;
66 }
67
68 @Override
69 public View getView(int position, View convertView, ViewGroup parent) {
70 // 判断这个image是否已经在缓存当中,如果没有就下载
71 final ViewHolder holder;
72 if (convertView == null) {
73 holder = new ViewHolder();
74 gridViewItem = (LinearLayout) getLayoutInflater().inflate(
75 R.layout.image_wall_item, null);
76 holder.imageView = (ImageView) gridViewItem
77 .findViewById(R.id.item_image);
78 holder.progressBar = (ProgressBar) gridViewItem
79 .findViewById(R.id.item_process);
80 gridViewItem.setTag(holder);
81 convertView = gridViewItem;
82 } else {
83 holder = (ViewHolder) gridViewItem.getTag();
84 }
85 this.imageLoad.displayImage(this.imageUrls[position],
86 holder.imageView, options,
87 new SimpleImageLoadingListener() {
88
89 @Override
90 public void onLoadingStarted(String imageUri, View view) {
91 holder.progressBar.setProgress(0);
92 holder.progressBar.setVisibility(View.VISIBLE);
93 }
94
95 @Override
96 public void onLoadingFailed(String imageUri, View view,
97 FailReason failReason) {
98 holder.progressBar.setVisibility(View.GONE);
99 }
100
101 @Override
102 public void onLoadingComplete(String imageUri,
103 View view, Bitmap loadedImage) {
104 holder.progressBar.setVisibility(View.GONE);
105 }
106
107 }, new ImageLoadingProgressListener() {
108
109 @Override
110 public void onProgressUpdate(String imageUri,
111 View view, int current, int total) {
112 holder.progressBar.setProgress(Math.round(100.0f
113 * current / total));
114 }
115 }); // 通过URL判断图片是否已经下载
116 return convertView;
117 }
118
119 }
120 }

复制代码

里面主要的对象都用 突出显示了。
三者的关系

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

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

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

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

ImageLoaderConfiguration

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

ImageLoaderConfiguration config = new ImageLoaderConfiguration.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(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();

复制代码

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

Display Options

每一个ImageLoader.displayImage(…)都可以使用Display Options。
复制代码

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();

复制代码

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

参考链接

http://blog.youkuaiyun.com/wangjinyu501/article/details/8091623

https://github.com/nostra13/Android-Universal-Image-Loader

http://www.intexsoft.com/blog/item/74-universal-image-loader-part-3.html

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了轴陀螺仪和轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值