博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Runnable 运行在那个线程
阅读量:7104 次
发布时间:2019-06-28

本文共 1544 字,大约阅读时间需要 5 分钟。

  hot3.png

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 的消息队列模型 

 

这里我们看代码 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的匿名内部类

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

转载于:https://my.oschina.net/MrGuan/blog/56010

你可能感兴趣的文章
Memcached管理与监控工具----MemAdmin
查看>>
Sql Server系列:子查询
查看>>
puppet 认证错误:Could not request certificate: unknown message digest algorithm
查看>>
我的友情链接
查看>>
JAVA转义字符
查看>>
[.Net线程处理系列]专题五:线程同步——事件构造
查看>>
struts2学习笔记1
查看>>
Linux mv命令
查看>>
POJ1088 滑雪
查看>>
nginx php有关cgi.fix_pathinfo导致文件类型错误解析漏洞
查看>>
Mysql创建索引
查看>>
flume channel monitor实现源码分析
查看>>
手机 app 开发的几种方式 ionic 学习思路以及 ionic 新建的项目分析
查看>>
MySQL-索引结构详解
查看>>
轻松理解C语言相关的编译器gcc和g++
查看>>
Oracle通过函数进行进制转化
查看>>
opencart smtp服务器 提示 Error: EHLO not accepted from server
查看>>
搭建Apache+tomcat+负载均衡环境
查看>>
原创文章:卷共享和SAN系统的实现原理与应用价值
查看>>
进程同步(OS课件)
查看>>