FinalBitmap 之 简单配置与加载原理
来源:互联网 发布:淘宝双十一晚会节目单 编辑:程序博客网 时间:2024/05/29 15:11
Afinal的宗旨是简洁,快速。
关于FinalBitmap:
使用finalBitmap,尽量一行代码完成所有事情。无需考虑bitmap在android中加载 的时候oom的问题和快速滑动的时候图片加载位置错位等问题。
通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和 android容器快速滑动时候出现的图片错位等现象。
FinalBitmap的内存管理使用lru算法,没有使用弱引用(android2.3以后google已经不建议使用弱引用,android2.3后 强行回收软引用和弱引用,详情查看android官方文档),更好的管理bitmap内存。
FinalBitmap可以配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等。FinalBitmap可以自定义下载器,用来扩展其他协议显 示网络图片,比如ftp等。
同时可以自定义bitmap显示器,在imageview显示图片的时候播放动画等(默认是渐变动画显示)。
在这里我们主要捣鼓捣鼓FinalBitmap的配置,看看FinalBitmap需要配置哪些参数,并引出display方法:
FinalBitmap finalBitmap;
finalBitmap = FinalBitmap.create(
this
);
finalBitmap.configBitmapLoadThreadSize(
3
);
//图片大小
finalBitmap.configBitmapMaxHeight(
800
);
finalBitmap.configBitmapMaxWidth(
480
);
//磁盘缓存路径
finalBitmap.configDiskCachePath(
""
);
finalBitmap.configDiskCacheSize(
10
*
1024
);
//配置显示
finalBitmap.configDisplayer(
new
Displayer() {
@Override
public
void
loadFailDisplay(View imageView, Bitmap bitmap) {
// TODO Auto-generated method stub
//设置失败 显示图片 404 等等
}
@Override
public
void
loadCompletedisplay(View imageView, Bitmap bitmap,
BitmapDisplayConfig config) {
// TODO Auto-generated method stub
// 加载成功 开启动画等等imageView.startAnimation();
}
});
//可自己定义下载器
finalBitmap.configDownlader(
new
Downloader() {
@Override
public
byte
[] download(String urlString) {
// TODO Auto-generated method stub
//自己写下载代码。这个已经是异步操作了
return
null
;
}
});
//加载时显示的图片。即默认图片
finalBitmap.configLoadingImage(
null
);
//配置内存缓存大小
finalBitmap.configMemoryCacheSize(
4
);
//待我后面再讲
finalBitmap.configRecycleImmediately(
true
);
finalBitmap.setExitTasksEarly(
true
);
//开始加载,如果你实例化后直接调用此方法,上面配置参数都默认的
finalBitmap.display(imageView,
"http://www.baidu.com/pic/logo.gif"
);
我们直接进入display方法
public
void
display(View imageView,String uri){
doDisplay(imageView,uri,
null
);
}
接着进入
private
void
doDisplay(View imageView, String uri, BitmapDisplayConfig displayConfig) {
if
(!mInit ){
init();
//用来建立缓存路径 :1.内存 2磁盘 3.实例化线程池。如果我们没有在上面配置,就会加载默认配置
}
if
(TextUtils.isEmpty(uri) || imageView ==
null
) {
//判断uri地址
return
;
}
if
(displayConfig ==
null
)
displayConfig = mConfig.defaultDisplayConfig;
Bitmap bitmap =
null
;
if
(mImageCache !=
null
) {
//判断是否在缓存中
bitmap = mImageCache.getBitmapFromMemoryCache(uri);
}
if
(bitmap !=
null
) {
//如果存在,直接加载
if
(imageView
instanceof
ImageView){
((ImageView)imageView).setImageBitmap(bitmap);
}
else
{
imageView.setBackgroundDrawable(
new
BitmapDrawable(bitmap));
}
}
else
if
(checkImageTask(uri, imageView)) {
//检测该任务是否已经运行了
final
BitmapLoadAndDisplayTask task =
new
BitmapLoadAndDisplayTask(imageView, displayConfig );
//自定义Drawable ,设置默认图片
final
AsyncDrawable asyncDrawable =
new
AsyncDrawable(mContext.getResources(), displayConfig.getLoadingBitmap(), task);
if
(imageView
instanceof
ImageView){
((ImageView)imageView).setImageDrawable(asyncDrawable);
}
else
{
imageView.setBackgroundDrawable(asyncDrawable);
}
task.executeOnExecutor(bitmapLoadAndDisplayExecutor, uri);
//执行加载任务
}
}
大家看看任务线程/**
* bitmap下载显示的线程
* @author michael yang
*/
private class BitmapLoadAndDisplayTask extends AsyncTask<Object, Void, Bitmap> {
private Object data;
private final WeakReference<View> imageViewReference;
private final BitmapDisplayConfig displayConfig;
public BitmapLoadAndDisplayTask(View imageView,BitmapDisplayConfig config) {
imageViewReference = new WeakReference<View>(imageView);
displayConfig = config;
}
@Override
protected Bitmap doInBackground(Object... params) {
data = params[0];
final String dataString = String.valueOf(data);
Bitmap bitmap = null;
synchronized (mPauseWorkLock) {
while (mPauseWork && !isCancelled()) {
try {
mPauseWorkLock.wait();
} catch (InterruptedException e) {
}
}
}
if (bitmap == null && !isCancelled()&& getAttachedImageView() != null && !mExitTasksEarly) {
bitmap = processBitmap(dataString,displayConfig);//下载数据
}
if(bitmap!=null){
mImageCache.addToMemoryCache(dataString, bitmap);//下载完成后加入缓存
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (isCancelled() || mExitTasksEarly) {
bitmap = null;
}
// 判断线程和当前的imageview是否是匹配
final View imageView = getAttachedImageView();
if (bitmap != null && imageView != null) {//显示数据
mConfig.displayer.loadCompletedisplay(imageView,bitmap,displayConfig);
}else if(bitmap == null && imageView!=null ){
mConfig.displayer.loadFailDisplay(imageView, displayConfig.getLoadfailBitmap());
}
}
@Override
protected void onCancelled(Bitmap bitmap) {
super.onCancelled(bitmap);
synchronized (mPauseWorkLock) {
mPauseWorkLock.notifyAll();
}
}
/**
* 获取线程匹配的imageView,防止出现闪动的现象
* @return
*/
private View getAttachedImageView() {
final View imageView = imageViewReference.get();
final BitmapLoadAndDisplayTask bitmapWorkerTask = getBitmapTaskFromImageView(imageView);
if (this == bitmapWorkerTask) {
return imageView;
}
return null;
}
}
©程序园,转载请保留原文链接:http://www.kwstu.com/ArticleView/419895180_201392995525464。
Afinal的宗旨是简洁,快速。
关于FinalBitmap:
使用finalBitmap,尽量一行代码完成所有事情。无需考虑bitmap在android中加载 的时候oom的问题和快速滑动的时候图片加载位置错位等问题。
通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和 android容器快速滑动时候出现的图片错位等现象。
FinalBitmap的内存管理使用lru算法,没有使用弱引用(android2.3以后google已经不建议使用弱引用,android2.3后 强行回收软引用和弱引用,详情查看android官方文档),更好的管理bitmap内存。
FinalBitmap可以配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等。FinalBitmap可以自定义下载器,用来扩展其他协议显 示网络图片,比如ftp等。
同时可以自定义bitmap显示器,在imageview显示图片的时候播放动画等(默认是渐变动画显示)。
在这里我们主要捣鼓捣鼓FinalBitmap的配置,看看FinalBitmap需要配置哪些参数,并引出display方法:
FinalBitmap finalBitmap;
finalBitmap = FinalBitmap.create(
this
);
finalBitmap.configBitmapLoadThreadSize(
3
);
//图片大小
finalBitmap.configBitmapMaxHeight(
800
);
finalBitmap.configBitmapMaxWidth(
480
);
//磁盘缓存路径
finalBitmap.configDiskCachePath(
""
);
finalBitmap.configDiskCacheSize(
10
*
1024
);
//配置显示
finalBitmap.configDisplayer(
new
Displayer() {
@Override
public
void
loadFailDisplay(View imageView, Bitmap bitmap) {
// TODO Auto-generated method stub
//设置失败 显示图片 404 等等
}
@Override
public
void
loadCompletedisplay(View imageView, Bitmap bitmap,
BitmapDisplayConfig config) {
// TODO Auto-generated method stub
// 加载成功 开启动画等等imageView.startAnimation();
}
});
//可自己定义下载器
finalBitmap.configDownlader(
new
Downloader() {
@Override
public
byte
[] download(String urlString) {
// TODO Auto-generated method stub
//自己写下载代码。这个已经是异步操作了
return
null
;
}
});
//加载时显示的图片。即默认图片
finalBitmap.configLoadingImage(
null
);
//配置内存缓存大小
finalBitmap.configMemoryCacheSize(
4
);
//待我后面再讲
finalBitmap.configRecycleImmediately(
true
);
finalBitmap.setExitTasksEarly(
true
);
//开始加载,如果你实例化后直接调用此方法,上面配置参数都默认的
finalBitmap.display(imageView,
"http://www.baidu.com/pic/logo.gif"
);
我们直接进入display方法
public
void
display(View imageView,String uri){
doDisplay(imageView,uri,
null
);
}
接着进入
private
void
doDisplay(View imageView, String uri, BitmapDisplayConfig displayConfig) {
if
(!mInit ){
init();
//用来建立缓存路径 :1.内存 2磁盘 3.实例化线程池。如果我们没有在上面配置,就会加载默认配置
}
if
(TextUtils.isEmpty(uri) || imageView ==
null
) {
//判断uri地址
return
;
}
if
(displayConfig ==
null
)
displayConfig = mConfig.defaultDisplayConfig;
Bitmap bitmap =
null
;
if
(mImageCache !=
null
) {
//判断是否在缓存中
bitmap = mImageCache.getBitmapFromMemoryCache(uri);
}
if
(bitmap !=
null
) {
//如果存在,直接加载
if
(imageView
instanceof
ImageView){
((ImageView)imageView).setImageBitmap(bitmap);
}
else
{
imageView.setBackgroundDrawable(
new
BitmapDrawable(bitmap));
}
}
else
if
(checkImageTask(uri, imageView)) {
//检测该任务是否已经运行了
final
BitmapLoadAndDisplayTask task =
new
BitmapLoadAndDisplayTask(imageView, displayConfig );
//自定义Drawable ,设置默认图片
final
AsyncDrawable asyncDrawable =
new
AsyncDrawable(mContext.getResources(), displayConfig.getLoadingBitmap(), task);
if
(imageView
instanceof
ImageView){
((ImageView)imageView).setImageDrawable(asyncDrawable);
}
else
{
imageView.setBackgroundDrawable(asyncDrawable);
}
task.executeOnExecutor(bitmapLoadAndDisplayExecutor, uri);
//执行加载任务
}
}
大家看看任务线程/**
* bitmap下载显示的线程
* @author michael yang
*/
private class BitmapLoadAndDisplayTask extends AsyncTask<Object, Void, Bitmap> {
private Object data;
private final WeakReference<View> imageViewReference;
private final BitmapDisplayConfig displayConfig;
public BitmapLoadAndDisplayTask(View imageView,BitmapDisplayConfig config) {
imageViewReference = new WeakReference<View>(imageView);
displayConfig = config;
}
@Override
protected Bitmap doInBackground(Object... params) {
data = params[0];
final String dataString = String.valueOf(data);
Bitmap bitmap = null;
synchronized (mPauseWorkLock) {
while (mPauseWork && !isCancelled()) {
try {
mPauseWorkLock.wait();
} catch (InterruptedException e) {
}
}
}
if (bitmap == null && !isCancelled()&& getAttachedImageView() != null && !mExitTasksEarly) {
bitmap = processBitmap(dataString,displayConfig);//下载数据
}
if(bitmap!=null){
mImageCache.addToMemoryCache(dataString, bitmap);//下载完成后加入缓存
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (isCancelled() || mExitTasksEarly) {
bitmap = null;
}
// 判断线程和当前的imageview是否是匹配
final View imageView = getAttachedImageView();
if (bitmap != null && imageView != null) {//显示数据
mConfig.displayer.loadCompletedisplay(imageView,bitmap,displayConfig);
}else if(bitmap == null && imageView!=null ){
mConfig.displayer.loadFailDisplay(imageView, displayConfig.getLoadfailBitmap());
}
}
@Override
protected void onCancelled(Bitmap bitmap) {
super.onCancelled(bitmap);
synchronized (mPauseWorkLock) {
mPauseWorkLock.notifyAll();
}
}
/**
* 获取线程匹配的imageView,防止出现闪动的现象
* @return
*/
private View getAttachedImageView() {
final View imageView = imageViewReference.get();
final BitmapLoadAndDisplayTask bitmapWorkerTask = getBitmapTaskFromImageView(imageView);
if (this == bitmapWorkerTask) {
return imageView;
}
return null;
}
}
©程序园,转载请保留原文链接:http://www.kwstu.com/ArticleView/419895180_201392995525464。
- FinalBitmap 之 简单配置与加载原理
- android开发中关于加载图片FinalBitmap的简单用法
- 使用FinalBitMap加载图片,url错误加载其他url解决办法
- 经验总结:Struts2原理与简单配置
- MVC之简单控制器实现与原理
- 【Android开源框架】FinalBitmap的简要介绍与使用
- 【Android开源框架】FinalBitmap的简要介绍与使用
- DisplayImageOptions的详细配置与简单的图片加载
- LVS(Linux Virtual Server)原理介绍与简单配置
- DAVE4中的时钟配置与简单原理介绍
- Nagios之基础理论与简单安装配置
- 解决CircleImageView不能用Afinal的FinalBitmap加载网络图片问题
- 简单的mvc配置加载类与日志类的编写与解析
- NAT原理与配置
- NAT原理与配置
- Keepalived原理与配置
- STP原理与配置
- jvm原理--简单的程序加载分析
- linux如何修改用户的密码
- DNA Sorting
- Android service
- C语言第十课
- 快速理解Docker - 容器级虚拟化解决方案 .
- FinalBitmap 之 简单配置与加载原理
- android布局的两个属性dither和tileMode
- xss插入代码和绕过过滤
- jconsole,jps无法查看到java进程
- Struts2 字符串显示 数字格式化异常
- 鼠标滚轮事件+键盘按键事件(仿《主公莫慌》官网)
- nyoj7街道最短路径问题
- 第十一周项目2--四个数的最大公约数
- Android获取视频缩略图