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。

这里我们看代码 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 Runnable相关推荐

  1. android runnable内存泄漏,这个Runnable可以防止内存泄漏吗?

    我在Java中的总的初学者和已经创建了一个简单的Java的Android片断其中一个Runnable 1,5秒钟后,我改变TextView从Hello World到Hola Mundo.它工作正常,基 ...

  2. Android Runnable与Handler和Thread的使用,Handler构造方法弱引用实现

    PS:在使用Runnable时,可能会内存泄露.Runnable是一个匿名内部类,因此它对当前Activity有一个隐式引用.如果Activity在销毁之前,任务还未完成, 那么将导致Activity ...

  3. 演化理解 Android 异步加载图片

    引用:http://www.cnblogs.com/ghj1976/archive/2011/05/06/2038738.html 下面测试使用的layout文件: 简单来说就是 LinearLayo ...

  4. android多线程讲解与实例

    本期的多线程主题与Android相关,侧重讲解在Android中如何用好多线程,需要你有Java的多线程基础. 首先我们思考几个问题,在Android应用中为什么要用多线程?为了解决哪些问题?或者为了 ...

  5. 蚂蚁开放平台开发第三方授权登陆(三):Android端

    开发前提: 拥有支付宝账户登录授权业务入参pid值.拥有APPID.App支付宝登录功能并成功签约 一.需求 用户在APP点击登录后,选择第三方登录中的"支付宝",跳转到支付宝客户 ...

  6. android 异步加载图片总结

    一Handler+Runnable模式 我们先看一个并不是异步线程加载的例子,使用 Handler+Runnable模式. 这里为何不是新开线程的原因请参看这篇文章:Android Runnable ...

  7. kivy html5,kivy 使用webview加载网页

    from kivy.app import App from kivy.uix.widget import Widget from kivy.clock import Clock from jnius ...

  8. Android开发笔记之:Handler Runnable与Thread的区别详解

    From:http://www.jb51.net/article/37465.htm 本篇文章是对在Android中Handler Runnable与Thread的区别进行了详细的分析介绍,需要的朋友 ...

  9. 【Android 异步操作】FutureTask 分析 ( Future 接口解析 | Runnable 接口解析 | Callable 接口解析 )

    文章目录 一.Future 接口 1.Future 接口简介 2.取消任务方法 3.Future 接口源码注释 二.Callable 接口 三.Runnable 接口 上一篇博客 [Android 异 ...

最新文章

  1. ubuntu自动挂载NTFS的方法
  2. 面向对象的基本设计原则【转】
  3. Eclipse更改系统主题
  4. 关于安卓调用C#的WebService上传图片问题(不使用ksoap2)
  5. 【tensorflow】 GPU 显存分配设置
  6. 概率分布的熵归一化(Entropy Normalization)
  7. c语言中参数的传递方式是,C语言函数的参数及传递方式
  8. 《布莱克智讯之声》公众号文章汇总
  9. Linux IPC实践(10) --Posix共享内存
  10. excel值false 显示否_Python数据分析包pandas中也有Excel的IF这么简单实用函数
  11. IDEA(Pycharm)一家子常用快捷键Keymap对应的英文、中文与具体位置
  12. echarts数据可视化_Golang 数据可视化利器 go-echarts 开源啦
  13. 【Python】Python中的日志级别
  14. 关于Mac电脑更新IP地址的解决方法!
  15. C语言练习,求x的y次方的代码
  16. 基于Dlib库构建人脸识别数据集
  17. 桌面计算机休眠快捷键,电脑休眠唤醒快捷键
  18. Mac -- 插入移动硬盘后没有显示
  19. 【Unity TMP外部字体导入问题】TMP中文,将字体生成为TMP_FontAsset常见问题
  20. matlab正方形追及问题,行测常考题型讲解:环形相遇与追及问题

热门文章

  1. 夜深人静写算法(二十六)- 记忆化搜索
  2. 华为畅享10、华为畅享10e、华为畅享10plus和华为畅享10s哪个好
  3. 机器学习之Scipy库
  4. 首席新媒体运营商学院黎想:全新快手直播的种草技巧
  5. R语言 : RJDBC 连接 h2数据库,绘基金净值图
  6. 航班订票功能的简要实现
  7. POJ_2488(DFS算法,西洋棋)
  8. MacBook pro真的可以做到完全不用鼠标吗?
  9. Linux-01-配置克隆机
  10. Mac如何允许安装任何来源软件?