一、 Handler与线程的关系


Handler在默认情况下,实际上它和调用它的Activity是处于同一个线程的。
例如在Handler的使用(一)的示例1中,虽然声明了线程对象,但是在实际调用当中它并没有调用线程的start()方法,而是直接调用当前线程的run()方法。


通过一个例子来证实一下


示例1:一个Android应用程序,在Activity中创建Handler和线程对象,并且在Activity的onCreate()方法中输出当前线程的id和名字,然后在线程对象的run方法中也打印输出下当前线程的id和名字。如果说,Activity输出的结果与线程对象输出的结果是一样的,那么就表示它们使用的是同一个线程。

下面是Activity代码:



根据结果可以看出,两个输出的id和name都相同,它们使用的是同一个线程。

现在将Activity中的代码修改一下,新建一个线程Thread,然后调用线程的start()方法,再观察一下控制台的输出结果。

这里只要将上面的代码稍微修改一下就可以了
1、先将handler.post(r)注释掉
2、再添加下面两句代码就OK了

从这个输出结果中可以看出,这次线程对象的id、name与activity里的线程id、name完全不一样了,由此可见,它们现在使用的不是同一个线程。

这个例子中还掩饰了一个效果,就是平时我们是将Handler的post()方法放在setContentView(R.layout.main)这个方法之后调用,将设置完布局之后再执行其他的操作,而在这个例子中,是将Handler的post()方法放在setContent()方法之前调用,而post里传递的线程对象的run()方法呢,又执行了休眠线程10秒钟,所以运行实现的效果会是,当程序运行后,首先Activity上没有任何内容,过来10秒之后,才会显示Activity里的内容。


更多相关文章

  1. Android(安卓)Binder设计与实现 – 设计篇
  2. Android(安卓)编程:calledfromWrongThreadException 的原因
  3. Android基础笔记(六)-网络编程
  4. Android中Timer类和TimerTask粗解
  5. Linux/Android——Input系统之frameworks层InputManagerService
  6. Android数据库操作的简单封装
  7. Android(安卓)学习之Drawable-shape使用方法
  8. 控制Android应用权限的五种方法
  9. android中MessageQueue,Message,Looper,handler的关系

随机推荐

  1. 如果在android中应用activemq
  2. Android应用程序键盘(Keyboard)消息处理机
  3. Android的Handler
  4. AndroidManifest.xml详解
  5. Android(安卓)NDK编译 ndk-build方式
  6. Android之使用Android-query框架进行开发
  7. android的binder机制研究(C++部分)
  8. Android(安卓)屏幕旋转(一):旋转设置
  9. android系统调用
  10. Content Provider的经典详细讲解