- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Android Universal ImageLoader 缓存图片由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
项目介绍:
Android上最让人头疼的莫过于从网络获取图片、显示、回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你。Universal Image Loader for Android的目的是为了实现异步的网络图片加载、缓存及显示,支持多线程异步加载。它最初来源于Fedor Vlasov的项目,且自此之后,经过大规模的重构和改进.
特性列举:
多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等 支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置 支持图片的内存缓存,文件系统缓存或者SD卡缓存 支持图片下载过程的监听 根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存 较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片 提供在较慢的网络下对图片进行加载 。
使用过程:
创建默认的ImageLoader,所有的操作都由ImageLoader控制。该类使用单例设计模式,所以如果要获取该类的实力,需要调用getInstance()方法。在使用ImageLoader显示图片之前,你首先要初始化它的配置,调用ImageLoaderConfiguration的init()方法,然后你就可以实现各种的显示了.
1
2
3
4
5
|
//创建默认的ImageLoader配置参数
ImageLoaderConfiguration configuration = ImageLoaderConfiguration
.createDefault(
this
);
//Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(configuration);
|
自定义配置imageloader, 就像你已经知道的,首先,你需要使用ImageLoaderConfiguration对象来初始化ImageLoader。由于ImageLoader是单例,所以在程序开始的时候只需要初始化一次就好了。建议你在Activity的onCreate()方法中初始化。如果一个ImageLoader已经初始化过,再次初始化不会有任何效果。下面我们通过ImageLoaderConfiguration.Builder创建一个设置 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
File cacheDir =StorageUtils.getOwnCacheDirectory(
this
,
"imageloader/Cache"
);
ImageLoaderConfigurationconfig =
new
ImageLoaderConfiguration
.Builder(
this
)
.memoryCacheExtraOptions(
480
,
800
)
// maxwidth, max height,即保存的每个缓存文件的最大长宽
.threadPoolSize(
3
)
//线程池内加载的数量
.threadPriority(Thread.NORM_PRIORITY -
2
)
.denyCacheImageMultipleSizesInMemory()
.memoryCache(
new
UsingFreqLimitedMemoryCache(
2
*
1024
*
1024
))
// You can pass your own memory cache implementation/你可以通过自己的内存缓存实现
.memoryCacheSize(
2
*
1024
*
1024
)
.discCacheSize(
50
*
1024
*
1024
)
.discCacheFileNameGenerator(newMd5FileNameGenerator())
//将保存的时候的URI名称用MD5 加密
.tasksProcessingOrder(QueueProcessingType.LIFO)
.discCacheFileCount(
100
)
//缓存的文件数量
.discCache(
new
UnlimitedDiscCache(cacheDir))
//自定义缓存路径
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.imageDownloader(
new
BaseImageDownloader(
this
,
5
*
1000
,
30
*
1000
))
// connectTimeout (5 s), readTimeout (30 s)超时时间
.writeDebugLogs()
// Remove for releaseapp
.build();
//开始构建
ImageLoader.getInstance().init(config);
|
得到imageLoader 。
1
|
ImageLoader imageLoader imageLoader = ImageLoader.getInstance();
|
使用过程:
(1)图像操作是否参与缓存以及图像效果的配置操作 。
1
2
3
4
5
6
7
8
9
|
DisplayImageOptions 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
)
//启用EXIF和JPEG图像格式
.displayer(
new
RoundedBitmapDisplayer(
20
))
//设置显示风格这里是圆角矩形
.build();
|
DisplayImageOptions以下是所有默认配置参数根据需求可以自定义配置 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
private
int
imageResOnLoading =
0
;
private
int
imageResForEmptyUri =
0
;
private
int
imageResOnFail =
0
;
private
Drawable imageOnLoading =
null
;
private
Drawable imageForEmptyUri =
null
;
private
Drawable imageOnFail =
null
;
private
boolean
resetViewBeforeLoading =
false
;
private
boolean
cacheInMemory =
false
;
private
boolean
cacheOnDisk =
false
;
private
ImageScaleType imageScaleType = ImageScaleType.IN_SAMPLE_POWER_OF_2;
private
Options decodingOptions =
new
Options();
private
int
delayBeforeLoading =
0
;
private
boolean
considerExifParams =
false
;
private
Object extraForDownloader =
null
;
private
BitmapProcessor preProcessor =
null
;
private
BitmapProcessor postProcessor =
null
;
private
BitmapDisplayer displayer = DefaultConfigurationFactory.createBitmapDisplayer();
private
Handler handler =
null
;
private
boolean
isSyncLoading =
false
;
|
(2)图片加载监听器在这里吧可以设置加载时的动画或者进度条之类的东西这里 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
ImageLoadingListener animateFirstListener =
new
AnimateFirstDisplayListener();
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);
}
}
}
}
|
(3)简单设置就可以给ImageView添加图片了 。
1
|
imageLoader.displayImage(imageUrl, imageview, options, animateFirstListener);
|
对于本地的图片 ,在其绝对地址前面要加入"file://"。网络图片就直接写路径了.
由于我的这个是最新的包,可能跟以前老的版本不同,看到有些网友说的是:
1
2
3
4
5
|
String imageUri =
"http://site.com/image.png"
; // 网络图片
String imageUri =
"file:///mnt/sdcard/image.png"
; //SD卡图片
String imageUri =
"content://media/external/audio/albumart/13"
; // 媒体文件夹
String imageUri =
"assets://image.png"
; // assets
String imageUri =
"drawable://"
+ R.drawable.image; // drawable文件
|
缓存的清理:
缓存的清理可以按需求来定,可以再每个Activity的生命周期函数onDestroy中清理也可以单独设置让用户自行清理.
1
2
3
4
5
6
|
@Override
public
void
onDestroy() {
super
.onDestroy();
imageLoader.clearMemoryCache();
imageLoader.clearDiskCache();
}
|
GirdView,ListView加载图片:
相信大部分人都是使用GridView,ListView来显示大量的图片,而当我们快速滑动GridView,ListView,我们希望能停止图片的加载,而在GridView,ListView停止滑动的时候加载当前界面的图片,这个框架当然也提供这个功能,使用起来也很简单,它提供了PauseOnScrollListener这个类来控制ListView,GridView滑动过程中停止去加载图片,该类使用的是代理模式 。
1
2
|
listView.setOnScrollListener(
new
PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
gridView.setOnScrollListener(
new
PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
|
第一个参数就是我们的图片加载对象ImageLoader, 第二个是控制是否在滑动过程中暂停加载图片,如果需要暂停传true就行了,第三个参数控制猛的滑动界面的时候图片是否加载 。
OutOfMemoryError:
虽然这个框架有很好的缓存机制,有效的避免了OOM的产生,一般的情况下产生OOM的概率比较小,但是并不能保证OutOfMemoryError永远不发生,这个框架对于OutOfMemoryError做了简单的catch,保证我们的程序遇到OOM而不被crash掉,但是如果我们使用该框架经常发生OOM,我们应该怎么去改善呢?
减少线程池中线程的个数,在ImageLoaderConfiguration中的(.threadPoolSize)中配置,推荐配置1-5 。
在DisplayImageOptions选项中配置bitmapConfig为Bitmap.Config.RGB_565,因为默认是ARGB_8888, 使用RGB_565会比使用ARGB_8888少消耗2倍的内存 。
在ImageLoaderConfiguration中配置图片的内存缓存为memoryCache(newWeakMemoryCache()) 或者不使用内存缓存 。
在DisplayImageOptions选项中设置.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者imageScaleType(ImageScaleType.EXACTLY) 。
通过上面这些,相信大家对Universal-Image-Loader框架的使用已经非常的了解了,我们在使用该框架的时候尽量的使用displayImage()方法去加载图片,loadImage()是将图片对象回调到ImageLoadingListener接口的onLoadingComplete()方法中,需要我们手动去设置到ImageView上面,displayImage()方法中,对ImageView对象使用的是Weak references,方便垃圾回收器回收ImageView对象,如果我们要加载固定大小的图片的时候,使用loadImage()方法需要传递一个ImageSize对象,而displayImage()方法会根据ImageView对象的测量值,或者android:layout_width and android:layout_height设定的值,或者android:maxWidth and/or android:maxHeight设定的值来裁剪图片 。
最后此篇关于Android Universal ImageLoader 缓存图片的文章就讲到这里了,如果你想了解更多关于Android Universal ImageLoader 缓存图片的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在我的应用程序中,我有一个包含一些项目的 ListView 。每个项目都有一个从远程 url 下载的 img。 我使用 ImageLoader 库将每个图像加载到我的应用中。 我的 ListView
This question already has answers here: What is a NullPointerException, and how do I fix it? (12个答案)
我正在使用 ImageLoader 从互联网加载图像。但我收到错误消息“E ImageLoader:连接超时”,跟踪是: 05-29 16:39:02.994 9988 10417 E ImageLo
在尝试加载以下 Activity 时,我遇到了 NullPoint 异常,我尝试解决这些问题,但我的尝试没有成功。 简而言之,有两个 Activity - 一个 Activity 填充数组列表,单击数
我正在使用 ImageLoader 在我的 ImageView 中显示图像。但它显示缓存的图像并显示旧图像。如何清除缓存?任何帮助将不胜感激... import java.io.File; impor
在我的 getView 中(对于我的适配器)我做 ImageView malImage = (ImageView)vi.findViewById(R.id.animelist_malimg);
我从 facebook api 发布了图片,我试图在我的应用程序中显示它们。但是在使用 imageloader 类时,尽管我将 wrap_content 保留在我的 ImageView 中,但图像的尺
我对 Universal Image Loader 库中的 DisplayImage 函数有疑问。如果我有一个像“www.myexample.com/image.jpg”这样的 url,然后说: Di
当我 try catch 图像或将图像从图库上传到 firebase 时出现此错误。我知道之前有人问过这个问题,但是我尝试了所有可能的解决方案。 这是 list 文件: logcat
我有一个带有适配器的 listView,它通过 ImageLoader 类从 URL 加载图像。问题是,直到列表项滚出屏幕后,屏幕上的图像才会显示/加载。 基本上,显示了 listView,但在您向下
我正在使用 ImageLoader 类从 url 加载图像并将其显示在列表显示。但是这个 ImageLoader 正在模拟器上加载图像,当我在没有加载任何图像的真实设备上运行我的应用程序。(只是显示默
以下是使用 volley 将图像从数据库检索到 View 页面的代码的一部分。我怎样才能将七张图片加载到 ImageView (加载所有图像位置)。如果我在“加载所有图像”位置独立输入任何图片,例如图
我正在使用 Novoda ImageLoader (https://github.com/novoda/ImageLoader),当我在 CursorAdapter 中使用这个加载器时,一切都很好。但
我在使用库时遇到了这个问题 我的应用类 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplic
我正在尝试使用 ImageLoader 显示带有外部图像链接的通知,但没有任何运气。 Logcat 不显示任何错误,也根本不显示通知。 这是我的代码: void shownot() { mNo
我正在使用 UniversalImageLoader 加载图像。但我面临的问题是同一图像被多次加载。下面是日志输出。 日志: 11-11 11:10:21.342 26932-26932/com.ex
我正在尝试使用 ImageAdapter 和 ImageLoader 将图片库显示为 GridView。不过,所有肖像图像都旋转了 +-90 度。我知道 getExifOrientation 代码来检
你好帮助者:)我已经实现了在一个 wordpress 页面上显示砖石流体网格中的图像,但是我在调用 HTML5 中的视频时遇到了问题(仅带有标签:)。问题是图像与 width: 50%; 完美配合
我在 Marsmallow 操作系统中遇到了小问题。我可以使用安卓6.0。但我看不到ImageView。例如:首先,我尝试 5.0 操作系统,一切正常。然后我可以使用6.0但我看不到Imageview
如果图像已经缓存,我不想下载它们。我正在使用 NOSTRA 的 ImageLoader 库。请告诉我是否有办法做到这一点。以下是代码:- DisplayImageOptions options
我是一名优秀的程序员,十分优秀!