Android Runnable 运行在那个线程

转载 2012年03月30日 00:04:25

http://www.cnblogs.com/ghj1976/archive/2011/05/06/2038516.html

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. ”

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的匿名内部类

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

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




Runnable运行在那个线程

Runnable归根结底是个接口,并不是一个线程。 转载自http://www.cnblogs.com/ghj1976/archive/2011/05/06/2038516.html Ru...
  • ni357103403
  • ni357103403
  • 2015年12月03日 10:19
  • 127

Android Runnable 运行在那个线程

Runnable 并不一定是新开一个线程,比如下面的调用方法就是运行在UI主线程中的: Handler mHandler=new Handler(); mHandler.post(n...
  • meegomeego
  • meegomeego
  • 2014年02月26日 17:14
  • 1461

Handler.post(Runable),Runable是运行在主线程中的。

在Android中可以通过handler方法完成数据的线程间的传递,但一定要将handler得到的数据通过loop传递到主线程再更新UI吗?其实也可以直接使用handler设计的post方法进行实现,...
  • qq_24004499
  • qq_24004499
  • 2017年07月27日 19:35
  • 120

Android Runnable运行在哪个线程

Android Runnable运行在哪个线程      Android中的Runnable并不一定是新开的线程,比如下面调用的方法就是运行在UI主线程中 Hanlder handler = ne...
  • lywoct
  • lywoct
  • 2016年05月26日 15:32
  • 180

Handler.postDelayed(new Runnable)是否运行在主线程

知识点 postDelayed(new Runnable())是否运行在主线程中? 答案 是的。 这个 new Runnable() 依附于创建Handler的线程, 代码如下 在绝对的UI...
  • zhencheng20082009
  • zhencheng20082009
  • 2017年03月26日 13:20
  • 2424

Handler.post执行时所在线程分析

问题描述: Android中Handler.post可以用来修改UI布局,handler.post(Runnable r)方法是将Runnable对象发送到主线程中执行,并且源码注释如下 * Cau...
  • u013136708
  • u013136708
  • 2016年01月29日 16:35
  • 2786

service怎么运行到非UI线程

我们都知道android中service是运行在UI线程中的,今天面试遇到一个问题,怎样让service运行到非UI线程中?我知道service在注册的时候可以通过android:process=":...
  • smallFish_lin
  • smallFish_lin
  • 2015年04月15日 17:43
  • 1478

Android TestCase中Thread问题

Android TestCase中Thread问题最近在研究Android TestCase,由于业务中很多代码采用的线程异步和回调的方式实现,打算用TestCase来检测下,没有想到在TestCas...
  • xia215266092
  • xia215266092
  • 2015年05月17日 21:29
  • 1162

android在主线程运行

Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { public void run...
  • u010799737
  • u010799737
  • 2016年05月20日 17:01
  • 890

解惑Android的post()方法究竟运行在哪个线程中

Android中我们常用的post()方法大致有两种情况:1.如果post方法是handler的,则Runnable执行在handler依附线程中,可能是主线程,也可能是其他线程下面是Handler里...
  • mynameishuangshuai
  • mynameishuangshuai
  • 2016年06月28日 22:14
  • 4126
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Runnable 运行在那个线程
举报原因:
原因补充:

(最多只允许输入30个字)