Runnable并不一定新开线程

前面谈到过Threads与Runnable的区别,这里再补充一个特殊的区别。

extends Thread一定新开一个线程,但Runnable不一定新开线程(所谓新开线程,指非UI线程):

① 如果是implements Runnable,像extends Thread一样,是新开了线程。

②如果是匿名Runnable对象new Runnable() {...},是把Runnable对象以Message形式post到UI线程的Looper里执行。


1) Runnable 并不一定是新开一个线程,比如下面的调用方法就是运行在UI主线程中的:

Handler mHandler=new Handler();
mHandler.post(new Runnable(){
	@Override
	public void run() {
		// TODO Auto-generated method stub
	}
});

官方对这个方法的解释如下,注意其中的:“The runnable will be run on the user interface thread. ”

我们可以通过调用handler的post方法,把Runnable对象(一般是Runnable的子类)传过去;handler会在looper中调用这个Runnable的Run方法执行。

 mHandler.post(new Runnable(){......}) 好像是new 了一个 interface, 其实是new的一个实现Runnable的匿名内部类(Inner Anonymous Class),这是很简练的写法!

上面的代码可以看成是: new anonymousClass() implement Runnable{......}

Runnable是一个接口,不是一个线程,一般要开线程的类会implements Runnable。

所以:

如果我们使用匿名内部类,则是运行在UI主线程的;

如果我们使用implements这个Runnable接口的线程类,则是运行在另一个新线程的。


2) View也可以post一个Runnable对象到UI线程你去执行:

View.post(Runnable)

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.

具体来说,View.post(Runnable)这个函数的工作原理如下:

在post(Runnable action)方法里,View获得当前线程(即UI线程)的Handler,然后将action对象post到Handler里。在Handler里,它将传递过来的action对象包装成一个Message(Message的callback为action,即通过Message可以回调action),然后将其投入UI线程的消息循环中。在Handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线程里,因此,我们可以在这个Runnable action里毫无顾虑的来更新UI,比如调用findViewById或者TextView.setText等

如下图,前面看到的代码,我们这里Message的callback为一个Runnable的匿名内部类

这种情况下,由于不是在新的线程中使用,而是在UI线程,所以千万别做复杂的计算逻辑。

image

参考资料:

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



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值