Handler中Runnable 并不是新开一个线程
来源:互联网 发布:亚马逊运营书籍知乎 编辑:程序博客网 时间:2024/05/16 14:14
Runnable 并不一定是新开一个线程,比如下面的调用方法就是运行在UI主线程中的:
Handler mHandler=new Handler();mHandler.post(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stub}});
官方对这个方法的解释如下,注意其中的:“The runnable will be run on the user interface thread. ”
boolean android.view.View .post(Runnable action)
Causes the Runnable to be added to the message queue. The runnable will be run on the user interface thread.
Parameters:
action The Runnable that will be executed.
Returns:
Returns true if the Runnable was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting.
我们可以通过调用handler的post方法,把Runnable对象(一般是Runnable的子类)传过去;handler会在looper中调用这个Runnable的Run方法执行。
Runnable是一个接口,不是一个线程,一般线程会实现Runnable。
有关 Looper、Handler,Thread 关系可以看这篇博客:
Android 的消息队列模型
http://www.cnblogs.com/ghj1976/archive/2011/05/06/2038469.html
这里我们看代码 mHandler.post(new Runnable(){ 好像是new 了一个 interface, 其实是new的一个实现Runnable的匿名内部类(Inner Anonymous Class),这是很简练的写法。
上面的代码可以看成是: new anonymousClass() implement interface{ [改写interface method]}
Runnable是一个接口,不是一个线程,一般线程会实现Runnable。 所以如果我们使用匿名内部类是运行在UI主线程的,如果我们使用实现这个Runnable接口的线程类,则是运行在对应线程的。
具体来说,这个函数的工作原理如下:
View.post(Runnable)方法。在post(Runnable action)方法里,View获得当前线程(即UI线程)的Handler,然后将action对象post到Handler里。在Handler里,它将传递过来的action对象包装成一个Message(Message的callback为action),然后将其投入UI线程的消息循环中。在Handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线程里,因此,我们可以毫无顾虑的来更新UI。
如下图,前面看到的代码,我们这里Message的callback为一个Runnable的匿名内部类
这种情况下,由于不是在新的线程中使用,所以千万别做复杂的计算逻辑。
参考资料:
Android中的Handler, Looper, MessageQueue和Thread
http://www.cnblogs.com/xirihanlin/archive/2011/04/11/2012746.html
Android系列之Message机制的灵活应用
http://tech.ddvip.com/2010-07/1280393505158258_3.html
- Handler中Runnable 并不是新开一个线程
- Handler中Runnable 并不是新开一个线程
- 【自用】Android中一个简单的计时器,用Handler加Runnable线程实现
- Runnable 并不一定是新开一个线程
- 线程,Handler,Message和Runnable
- Handler将Runnable放入线程队列,removecallback()移除Runnable
- 线程安全2:handler、message、runnable
- 线程安全2:handler、message、runnable
- 在子线程中new一个Handler
- handler runnable
- Runnable Handler
- android中Thread、handler(Handler Thread)、Runnable之间的关系
- Android中的Handler的post(Runnable(){})方法的线程
- handler.post(Runnable r) 会阻塞UI线程。
- 安卓线程相关 HandlerThread Handler Thread Looper Message Runnable
- Runnable接口实现线程,Handler消息队列更新UI
- android开发笔记之handler+Runnable的一个巧妙应用
- 关于handler.post(Runnable runnable)
- CSS 布局:40个教程、技巧、例子和最佳实践
- android用户界面之Gallery3D学习资料汇总
- .块设备驱动之nandflash——简单程序分析
- Xcode 4.4中LLVM compiler 4.0带来的Objective-C新语法特性
- 我适合的职业
- Handler中Runnable 并不是新开一个线程
- JS正则表达式
- 爱情如江南的青花瓷
- oracle trunc 函数
- 生活之道
- 20个新鲜使用的CSS3教程
- A tcpdump Tutorial and Primer-转自http://danielmiessler.com/
- error C2101: '&' on constant
- IOS的疯狂游戏:浮躁气氛正笼罩整个iOS游戏市场