您的位置:首页 > 产品设计 > UI/UE

Handler实现与机制 && Blocking Queue && IdleHandler使用

2015-06-29 22:09 549 查看
Handler和Looper的关系:

简单的说:有一个消息队列MessageQueue,handler要做的工作就是处理从这个消息队列中拿出的Message对象,

那么谁负责遍历和拿取消息队列内的消息给handler呢?没错,这些遍历和拿取的工作就是Looper来完成的。

总结:Handler会用Looper不断地从MessageQueue中获取并处理消息,这将导致handler类中处理消息的方法handleMessage()被回调。

Handler有两类发送消息的方式:

一类是postXXX()方法,该方法把一个Runnable对象发送到消息队列,从而当消息被处理时,能够执行Runnable对象;

另一类是sendXXX()方法,该方法用于发送一个Message类型的消息到消息队列,当消息被处理时,系统会调用Handler对象定义的handleMessage()方法处理该消息

post(Runnable r)与sendMessage()区别:

1 在子线程中利用post(Runnable r)更新UI,原理和sendMessage()类似

2.在子线程中利用post(Runnable r)更新UI”这个说法不是特别准确,确切地说还是在子线程中发送了消息到主线程的消息队列从而更新了UI

3.调用post(Runnable r)不会开启一个新的线程,UI的更新是在主线程中完成的, 所以在post方法中勿做耗时操作

阻塞队列(Blocking Queue)--实现生产者消费者模式 :

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,通过Blocking Queue生产者和消费者可以以不同的速度生产和消费数据,你可以独立地或并发的编写消费者和生产者,它仅仅只需知道共享对象是谁。在Android中比较典型的Handler实现了这个模式Looper不停地从MessageQueue中去拿消息,并调用HandleMessage去消费消息。

具体Java代码可以参考 http://blog.csdn.net/collonn/article/details/24874971
IdleHandler延时操作提升性能:

希望能够在当线程空闲做些准备工作,比如主线程在开始加载页面完成后,如果线程空闲就提前加载些二级页面的内容。对于这种情况下,可以考虑使用MessageQueue.IdleHandler来实现。

具体的实现方式:

getMainLooper().myQueue().addIdleHandler(new ThreadIdleHander());

其中:

class ThreadIdleHander implements MessageQueue.IdleHandler {
@Override
public boolean queueIdle() {
// do something ...
return false;
}
}

getMainLooper是获得当前主线程的Looper,然后在其中的MessageQueue中加入一个IdleHandler.当线程空闲时,就会去调用queueIdle()函数,如果返回值为True,那么后续空闲时会继续的调用此函数,否则不再调用;

loop每次从MessageQueue取出一个Message,如果当前队列中没有任何消息的时,就去查找是否注册了IdleHandler的回调,如果有的话,则每个的执行,逻辑很简单。

最后另一种直接匿名类的写法也是可以的:

Looper.myQueue().addIdleHandler(new IdleHandler() {
@Override
public boolean queueIdle() {
// TODO Auto-generated method stub
//你想做的任何事情
//........
return false;
}
});


参考以下文章:
http://blog.csdn.net/Linux1s1s/article/details/46593003?ref=myread http://blog.csdn.net/stonecao/article/details/6417364 http://blog.csdn.net/illusion_luna/article/details/8222657 http://droidyue.com/blog/2014/12/28/in-android-handler-classes-should-be-static-or-leaks-might-occur/
android疯狂讲义3.5节
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: