Handler的使用(二)

一、 Handler与线程的关系

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

通过一个例子来证实一下

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

package eoe.demo;

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler;

public class HandlerTwo extends Activity { 
/** Called when the activity is first created. */

Handler handler = new Handler();

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
//在设置布局文件之前先调用post方法, 
//表示在执行完线程之后才会显示布局文件中的内容,而线程中又设置了休眠10秒钟, 
//所以最终效果为,先显示应用程序主界面,等待10秒钟之后才显示布局文件中的内容 
handler.post(r); 
setContentView(R.layout.main); 
System.out.println("activity id--->"+Thread.currentThread().getId()); 
System.out.println("activity name--->"+Thread.currentThread().getName()); 
}

Runnable r = new Runnable(){

public void run() { 
//输出当前线程的id和name 
//如果这里输出的线程id、name与上面onCreate()方法中输出的线程id、name相同的话, 
//那么则表示,他们使用的是同一个线程 
System.out.println("runnable_id--->"+Thread.currentThread().getId()); 
System.out.println("runnable_name--->"+Thread.currentThread().getName()); 
try{ 
Thread.sleep(10000); //让线程休眠10秒 
}catch(InterruptedException e){ 
e.printStackTrace(); 


}; 
}

下图是执行的结果:

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

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

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

//handler.post(r); 
Thread t = new Thread(r); 
t.start(); 

输出结果:

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

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

二、 Bundle和如何在新线程中处理消息
       首先介绍一下Bundle:

       Bundle它是一个以string为键,可以由其他数据类型作为值的一个mapping,相当于把数据当成一个包。在初学的阶段可以将它当成特殊的一个HashMap对象,不过HashMap的键和值都是Object类型的,而Bundle的键却是String类型。

通过一个例子来使用一下Bundle和如何在新线程中处理消息
       示例2:一个Android应用程序,先打印Activity当前使用的线程id,然后再创建一个新线程,使用Bundl存储值,最后打印出线程的id和Bundle中存储的值。
看一下输出结果:

转载于:https://www.cnblogs.com/zziss/archive/2012/02/14/2351955.html

Android Handler的使用(二)相关推荐

  1. Android handler Thread 修改UI Demo

    /*********************************************************************** Android handler Thread 修改UI ...

  2. Android Handler原理

    前言 Handler消息处理机制在Android开发中起着举足轻重的作用,我们有必要好好理解下其原理,先前我写的一篇文章,感觉疏漏了好多东西,因此打算写这篇文章,下面我们先从一个简单的例子出发 一.日 ...

  3. Android解析WindowManagerService(二)WMS的重要成员和Window的添加过程

    前言 在本系列的上一篇文章中,我们学习了WMS的诞生,WMS被创建后,它的重要的成员有哪些?Window添加过程的WMS部分做了什么呢?这篇文章会给你解答. 1.WMS的重要成员 所谓WMS的重要成员 ...

  4. Android Handler讲述很详细的一篇文章

    Android中的Handler <一> Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时,Android首先会开启一个主线程 ...

  5. Android实现网络下载二(多任务下载--支持断点续传)

    Android实现网络下载二(多任务下载–支持断点续传) 上文中说了单任务的断点续传,这篇文章就说说多任务下载,不啰嗦了,直接进入正题. 附上demo源码,GitHub代码后续上传,这里的链接还是cs ...

  6. Android zxing,轻松实现二维码扫描、生成

    Android  zxing,轻松实现二维码扫描.生成 一.二维码与条形码工作原理 目前的很多应用上都有扫码功能,当时微信推出二维码扫码功能时,觉得imagine,通过一张简单的图片就能扫描添加还有, ...

  7. 第十章 进程间的通信 之 Java/Android多线程开发(二)

    文章目录 (一)Java 多线程开发 1.1)线程状态 1.2)线程控制方法 (1.2.1)Synchronized (1.2.2)Volatile (1.2.3)ReentrantLock 1.3) ...

  8. Android架构组件(二):LiveData

    前言 上篇文章我们分析了Lifecycle的使用和原理,相信我们已经学会了用Lifecycle将你所需的类添加声明周期管理,如果只是寥寥阅读也没关系,这里奉上(双膝跪地)上篇地址,Android架构组 ...

  9. Android自定义动画专题二

    android自定义动画专题二 在上篇文章中给大家介绍了android自定义动画的第一种表现形式:view的绘制:不过这只是一种单纯利用自定义控件绘制的方式去实现:这篇文章会给大家演示如何通过自定义控 ...

最新文章

  1. PAT(甲级)2021年春季考试 7-1 Arithmetic Progression of Primes
  2. 全球主要城市经纬度api
  3. JVM Class字节码之三-使用BCEL改变类属性
  4. TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现
  5. 语法制导的翻译是如何实现的_全球化企业应该如何选择机器翻译解决方案?
  6. 在VS2003下把一个DataTable Update 到数据库
  7. 以太网交换芯片行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  8. java基础视频教程 学习笔记
  9. MySQL之表的约束(主键、外键、唯一键、自增长、列描述、默认值、空属性)
  10. 计算机课word实验总结,大学计算机操作实践报告【实验8】Word2010综合实验
  11. unity3d Space Game太空射击游戏资源包
  12. 计算机专科大学三年规划书,专科大学规划书范文
  13. android隐藏桌面图标
  14. 基于Dragonboard 410c设计的智能管家
  15. python怎么绘制图例_用Python绘制图例
  16. 线上Debug神器--Arthas(阿尔萨斯)
  17. 全网最便宜的OpenHarmony开发板和模组Neptune问世(基于联盛德W800的SoC),9.9元带蓝牙和wifi功能还包邮
  18. Console.read()、Console.readline()、Console.readkey()和Console.Write、Console.Writeline()的意思
  19. “第一股”争夺战:每日优鲜、叮咚买菜及美菜网谁能杀出重围?
  20. Java模拟鼠标键盘输入事件 --- Robot 类

热门文章

  1. 2022-2028年中国石油钻井井下工具行业市场研究及前瞻分析报告
  2. 2022-2028年中国聚硫橡胶行业市场研究及前瞻分析报告
  3. Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务
  4. SpringCloud Alibaba微服务实战(四) - Nacos Config 配置中心
  5. matplotlib交互模式
  6. ?:在正则表达式中什么意思
  7. gensim的word2vec如何得出词向量(python)
  8. Navicat导出表结构导出成Excel
  9. C/C++语言编程的隐患!
  10. 前端的单页面模式和多页面模式