Imageloader<6>-mUIHandler的初始化
【摘要】
UIHandler的初始化我们并没有在init()初始化,考虑到逻辑性和合理性,我们在加载图片的时候进行初始化UIHandler。核心代码loadImage(String path ,ImageView ...
UIHandler的初始化我们并没有在init()初始化,考虑到逻辑性和合理性,我们在加载图片的时候进行初始化UIHandler。核心代码loadImage(String path ,ImageView imageView)方法。
思考下,loadImage() 方法,需要根据图片路径,将对应的图片设置到ImageView中,所以loadImage()方法有2个入参,String path 和 ImageView imageView.
根据我们的策略:加载图片首先从缓存中查找,如果找到直接返回回调UIHandler的handleMessage()设置图片,如果缓存中没有则开启任务去加载图片并添加到缓存。这个Task任务是由任务队列TaskQueue管理,所以我们需要将任务添加到任务队列中,然后通过Looper+Message+Handler机制 发送通知,通知后台轮询线程,通知线程池根据用户选择的图片加载策略去获取一个task即Runnable对象去加载图片。
/**
* 加载图片的核心方法
* 实例化UIHanlder
* 首先从缓存中获取,如果获取不到,
*
* @param path
* @param imageView
*/
public void loadImage(String path, final ImageView imageView) {
// 设置标签,防止多次调用图片加载时的混乱
imageView.setTag(path);
// 初始化UIHandler
if (mUIHandler == null) {
mUIHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 将图片设置到ImageView
ImageBeanHoler holer = (ImageBeanHoler)msg.obj ;
ImageView imageView1 = holer.imageView ;
Bitmap bitmap = holer.bitmap ;
String path = holer.path ;
// 将path和getTag一致 这设置图片。
// 比如换到第二屏的时候,path已经改变,但imageView是复用的,所以要判断下是否相等
if(imageView.getTag().toString().equals(path)){
imageView.setImageBitmap(bitmap);
}
}
};
}
// 从缓存中获取图片
Bitmap bitmap = getBitmapFromLruCache(path);
// 图片不为空 ,发送消息 更新图片
if (bitmap != null) {
Message message = Message.obtain();
// 在此处赋值,确保回调handlerMessage()获取的是同一个bitmap imageView 和 path
ImageBeanHoler holder = new ImageBeanHoler();
holder.bitmap = bitmap ;
holder.imageView = imageView ;
holder.path = path ;
// 将holder赋值给message.obj
message.obj = holder;
// 发送消息
mUIHandler.sendMessage(message);
}else{
// 如果图片不存在 则添加到任务队列中
addTask(new Runnable(){
@Override
public void run() {
// 加载图片 TODO
}
});
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
/**
* 为了防止错乱,不能够直接使用bitmap,因为回调后设置的bitmap已经改变,
* 需要将一个图片所有的属性(path ,Bitmap ,imageView)再此封装一下
*/
private class ImageBeanHoler{
public ImageView imageView ;
public Bitmap bitmap ;
public String path ;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
/**
* 将任务添加到任务队列中,然后发送消息通知后台轮询线程去任务池中取出一个队列去执行
* @param runnable
*/
private void addTask(Runnable runnable) {
mTaskQueue.add(runnable);
mPoolThreadHandler.sendEmptyMessage(0x111);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
mPoolThread = new Thread() {
@Override
public void run() {
Looper.prepare();
mPoolThreadHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 线程池从任务队列中去取出一个任务进行执行
mThreadPool.execute(getTask());
}
};
Looper.loop();
}
};
mPoolThread.start();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
/**
* 从任务队列中根据图片加载策略获取task
* @return
*/
private Runnable getTask() {
if(mType == Type.FIFO){
// 如果是先进先出的话,则从队列中移除队首,获得队首去执行,即第一次进来的那个Runnable对象
return mTaskQueue.removeFirst();
}else if(mType == Type.LIFO){
// 如果是后进先出的话,则从队列中移除队尾,获取最后进来的那个Runnable对象去执行
return mTaskQueue.removeLast();
}
return null;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。
原文链接:artisan.blog.csdn.net/article/details/50300399
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)