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。所以如果我们使用匿名内部类是运行在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://www.cnblogs.com/qingblog/archive/2012/08/08/2628245.html

转:Android View.post(Runnable )相关推荐

  1. android.view.ViewRoot$CalledFromWrongThreadException的解决办法

    android 是不允许子线程直接更新UI的,如果一定要在子线程直接更新UI就会出现android.view.ViewRoot$CalledFromWrongThreadException: Only ...

  2. Android Service与Runnable整合并用

    服务的启动没有Activity,即便是利用Activity带起服务,也会有各看成独立的事件及焦点要处理. Service继承自Android.app.Service. 服务的生态链就先从onCreat ...

  3. 发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方案

    在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示.但是,在主线线程之外的线程中直接更新页面显示的问题是 报异常:android.vie ...

  4. Android View体系(五)从源码解析View的事件分发机制

    Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Sc ...

  5. Android View 绘制流程

    前面讲到 Android View 加载流程,使用 LayoutInflater 将 xml 文件转变成 View ,但是还需要将 View 绘制出来,才能被用户看到,这一过程为绘制流程.由于 And ...

  6. 在android view中写坦克大战

    我是把以前写在java里的代码直接移植到android上了(后面贴的代码有比较的部分) 只改了画笔的对象,和控制方式 代码大致思路 1.画 我们要画出坦克,炮弹,爆炸效果 1.1画坦克 1.1.1画竖 ...

  7. 一文读懂Android View事件分发机制

    Android View 虽然不是四大组件,但其并不比四大组件的地位低.而View的核心知识点事件分发机制则是不少刚入门同学的拦路虎.ScrollView嵌套RecyclerView(或者ListVi ...

  8. Android JS调原生 有盟分享 打开微信分享 原程序崩溃问题 报android.view.ViewRootImpl$CalledFromWrongThreadException:

    报的问题:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created ...

  9. Android View体系(1)

    Android View体系 Activity并没有与ViewRoot和View树有直接的联系,它含有一个Window对象 private Window mWindow; Window是一个抽象类,持 ...

最新文章

  1. NYOJ 990 蚂蚁感冒
  2. 计划得一步一步实施,题库首先是第一步!
  3. 使用Java编写简单的老虎机游戏
  4. 逻辑回归的通俗解释 逻辑回归的定位
  5. Java 蓝桥杯 字符串对比
  6. spring-boot-maven-plugin插件
  7. JavaSE12:集合简单总结
  8. LFS5.0安装完成心得
  9. DWR学习笔记--转载
  10. 12月1日高级软件测试例会记录
  11. s3c2440 linux3.2.65 uda134x声卡卡顿,杂音修复
  12. 数据分析 - 安然事件
  13. JAVA初学,小白编程,8大基本类型
  14. 解决:el-input添加clearable属性后出现2个×清除图标
  15. Fiddler Response中Raw显示乱码的解决方式
  16. mysql实践周心得_实践周心得体会
  17. 单神经元自适应控制算法,神经网络自校正控制
  18. IIS架设WebService服务端的基本错误:试图加载格式不正确的程序
  19. Java后端学习视频和资源分享
  20. 2006年春运广州站临客时刻表

热门文章

  1. easyui刷新几种方式
  2. 无法启动因为计算机丢失ac1st16,重装系统后cad2006打不开.提示因为计算机中丢失ac1st16.dll...
  3. java 代码段 执行超时 抛异常_Java 并发队列详解TransferQueue、BlockingQueue、BlockingDeque
  4. mysql密码登陆过程_mysql单实例忘记密码如何登陆过程
  5. qlistwidget窗口隐藏会发送什么信号_为什么wifi连的人越多,就越慢?
  6. 北京大学生物信息学(8)
  7. 地脚螺钉直径系列_机械系统通用件——螺栓、螺钉和螺柱国家标准
  8. aliyun windows开启远程_阿里云物联网平台远程配置功能JAVA 示例参考
  9. 关于马尔科夫随机场MRF的思考
  10. 现代分类方法在医学诊断中的应用——基于R的实现