我们说handler是开启了另外一个线程,而且看代码的话确实是这样,实现了runnable接口,这在java中就是开启了一个线程,但是情况中的是这样吗?我们不妨来做个试验,如下

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.os.Handler;
  4.  
  5. public class handlerThread extends Activity {
  6. /** Called when the activity is first created. */
  7. @Override
  8. public void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11.  
  12. Handler handler = new Handler();
  13. handler.post(r);
  14. System.out.println("activity线程ID:"+Thread.currentThread().getId());
  15. System.out.println("activity线程name:"+Thread.currentThread().getName());
  16. }
  17.  
  18. Runnable r = new Runnable(){
  19.  
  20. @Override
  21. public void run() {
  22. // TODO Auto-generated method stub
  23. System.out.println("handler线程ID:"+Thread.currentThread().getId());
  24. System.out.println("handler线程name:"+Thread.currentThread().getName());
  25. try {
  26. Thread.sleep();
  27. } catch (InterruptedException e) {
  28. // TODO Auto-generated catch block
  29. e.printStackTrace();
  30. }
  31. }
  32.  
  33. };
  34. }

运行结果

其实,当我看到这里的时候也不敢相信,但是事实就是这样,handler没有重新开启一个线程,而是跟activity在同一个线程里,但是这种写法也就非常接近java的标准线程的写法了,难怪会误导人,如下是java的标准线程写法。

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.os.Handler;
  4.  
  5. public class handlerThread extends Activity {
  6. /** Called when the activity is first created. */
  7. @Override
  8. public void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11.  
  12. // Handler handler = new Handler();
  13. // handler.post(r);
  14. Thread t = new Thread(r);
  15. t.start();
  16. System.out.println("activity线程ID:"+Thread.currentThread().getId());
  17. System.out.println("activity线程name:"+Thread.currentThread().getName());
  18. }
  19.  
  20. Runnable r = new Runnable(){
  21.  
  22. @Override
  23. public void run() {
  24. // TODO Auto-generated method stub
  25. System.out.println("handler线程ID:"+Thread.currentThread().getId());
  26. System.out.println("handler线程name:"+Thread.currentThread().getName());
  27. try {
  28. Thread.sleep();
  29. } catch (InterruptedException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. }
  33. }
  34.  
  35. };
  36. }

运行结果如下:

这里就才是我们这种想要的结果,两者比较我们就会发现,handler虽然实现了 runnable接口,但是却并没有启动一个线程,而是直接调用run方法。那andriod为什么要这样设计呢,既然不启动新的线程,为什么还要多此一 举来实现runnable接口呢,我们继续探讨,下次再说。

Android handler真的是重新启动一个线程吗?的更多相关文章

  1. [原创]Android Handler使用Message的一个注意事项

    最近发现了一个莫名其妙的问题,在使用Handler.post(Runnable)这个接口时,Runnable有时候没有运行,非常奇怪,后来发现是因为调用Handler.removeMessage()时 ...

  2. android Handler介绍

    Handler使用介绍: Handler根据接收的消息,处理UI更新.Thread线程发出消息,通知Handler更新UI. Handler mHandler = new Handler() {  p ...

  3. Android Handler学习笔记

    已经习惯了挖坑不填,继续任性一下,周一到周五继续挖坑,每周六周日负责填坑. 1.从Android UI线程谈起 出于性能考虑,Android 中的UI操作并不是线程安全的,所以Android中规定只能 ...

  4. Java 如何正确停止一个线程

    自己在做实验性小项目的时候,发现自己遇到一个问题:如何控制线程的"死亡"? 首先,如何开启一个线程呢? 最简单的代码: public class Main { public sta ...

  5. 死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  6. Java里一个线程两次调用start()方法会出现什么情况

    Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常,多次调用start被认为是编程错误. 如果业务需要线程run中的代码再 ...

  7. Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)

    转载自http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长 ...

  8. android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面

    下面是快速创建一个新线程的方法: 第一种:直接创建子线程并启动      new Thread() {@Overridepublic void run() {     //这里写入子线程需要做的工作  ...

  9. 源码分析Android Handler是如何实现线程间通信的

    源码分析Android Handler是如何实现线程间通信的 Handler作为Android消息通信的基础,它的使用是每一个开发者都必须掌握的.开发者从一开始就被告知必须在主线程中进行UI操作.但H ...

随机推荐

  1. Lambda(2)

    Lambda表达式是匿名方法的超集,处理匿名方法有的功能外,还有其他的功能: 1.能够推测出参数的类型,无需显示声明 2.支持语句块和表达式作为方法体 Lambda表达式的书写方式: Lambda表达 ...

  2. jquery-easyui中datagrid扩展,隐藏显示表头功能

    今天,后台中需要新增一个功能,用户可以自由选择显示的列,之后保存到本地localStroage中.所以扩展了easyui中datagrid的onHeaderContextMenu方法. 使用方法: _ ...

  3. XAML 概述一

    XAML的全称是Extensible Application Markup Language,就是我们所说的可扩展应用程序标记语言.XAML可以应用到许多不同领域,但主要用于构建用户界面. XAML是 ...

  4. Thinkphp常用的方法和技巧(转)

    2012年09月26日 Thinkphp 里一些常用方法和技巧的整理,包括常用的快捷键以及在程序开发时用到的一些实用方法,关于快捷键用得不是很熟练,总之,掌握这些方法和技巧,对于我们开发 thinkp ...

  5. Android手机做无线中继路由器

    为什么要拿手机做路由器?因为我现在每天要带着一个火柴盒大小的路由器(703n).它提供了一个f了q的无线网络,电脑,手机,平板等设备连接上这个无线网络之后之后就可以自由上twitter,看youtub ...

  6. MyEclipse 2013官网下载地址以及破解方法

    刚刚发布了MyEclipse 2013,我现在用的还是6.5的版本,6.5的版本是我觉得最好用的一个版本. 我装上了,还没感受到有哪些好用,就是感觉体积庞大,和IBM 的WID一样,是个多面手,啥事都 ...

  7. ubuntu下格式化内存当硬盘使的小实验

    内存虚拟硬盘(ramdisk)是指通过软件技术,将物理内存进行分割,将一部分内存通过虚拟技术转变为硬盘以较大幅度提升计算机数据读取速度和保护硬盘. 在ubuntu下的dev下有ram相关的文件,这些文 ...

  8. windows android studio 编译Jni动态库

    项目需要,折腾了半天搞定windows android studio环境编译Jni动态库,现记录下来. 准备安装环境: 1. android studio 下载地址是http://www.androi ...

  9. asynDBcenter(复习)

    asynDBCenter asynDBCenter是GS和DBCenter之间的模块,有了他GS访问数据库就是异步的了,以前是同步的,加入某个操作很耗时那么GS就在那等待这个返回值. .对于std:: ...

  10. 【锋利的JQuery-学习笔记】广告栏

    效果图: html: <div id="jnImageroll"> <a href="#nogo" id="JS_imgWrap&q ...