Android Runnable运行在哪个线程 Android中的Runnable并不一定是新开的线程,比如下面调用的方法就是运行在UI主线程中 Hanlder handler = new Handler(); handler.post(new Runnable(){ public void run(){ } }); 官方文档对此的解释是:

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接口

这里我们看代码handler.post(new Runnable(){好像是new了一个interface,其实是new一个实现Runnable的匿名内部类(Inner Anoymous Class)}) 这是一个简练的方法

Runnalbe是一个接口,不是一个线程,一般线程会实现Runnalbe接口,所以如果我们使用匿名内部类是运行在UI主线程的,如果我们使用实现这个Runnable接口的线程类,则是运行在对应的线程的。

具体来说这个函数的工作原理如下:

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

如下图,前面看到的代码,我们这里的Message的callback为一个Runnalbe的匿名内部类,这种情况下,由于不是在新的线程中使用,所以千万别做复杂的计算逻辑。



更多相关文章

  1. Android(安卓)实现中文按拼音排序方法
  2. Android屏幕截图实现
  3. Handler内存泄露原理及解决方法
  4. android 点击桌面图标,打开手机浏览器进入相应的网站
  5. Android(安卓)- SharedPreferences 数据存储
  6. Android常用工具库
  7. Android开发全程记录(十五)——android调用webservice的方法
  8. Android(安卓)YUV视频数据叠加时间信息
  9. Ubuntu编译Android(安卓)KitKat 4.4出现Chromium gyp HashSet_jn

随机推荐

  1. ICS 系统栏分析(一)
  2. java集合系列(9)TreeMap
  3. Android调用系统自带的设置界面
  4. 设计模式之观察者模式
  5. 线程池你真不来了解一下吗?
  6. 多线程之死锁就是这么简单
  7. VSCode跳转到定义内部实现_VSCode插件开
  8. ES2018
  9. TypescriptServerPlugin_VSCode插件开发
  10. Taro