Handler的使用(二)

一、 Handler与线程的关系

Handler在默认情况下,实际上它和调用它的Activity是处于同一个线程的。

例如在Handler的使用(一)的示例1中,虽然声明了线程对象,但是在实际调用当中它并没有调用线程的start()方法,而是直接调用当前线程的run()方法。

通过一个例子来证实一下

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


下面是Activity代码:

package android.handler;

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中存储的值。


看一下输出结果:



android Handler的使用(二)的更多相关文章

  1. Android Handler处理机制 ( 二 ) ——Handler,Message,Looper,MessageQueue

    Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...

  2. Android线程管理(二)——ActivityThread

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  3. Android handler Thread 修改UI Demo

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

  4. 深入理解之 Android Handler

    深入理解之 Android Handler   一,相关概念 在Android中如果通过用户界面(如button)来来启动线程,然后再线程中的执行代码将状态信息输出到用户界面(如文本框),这时候就会抛 ...

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

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

  6. 二维码合成,将苹果和安卓(ios和android)合成一个二维码,让用户扫描一个二维码就可以分别下载苹果和安卓的应用

    因为公司推广的原因,没有合适的将苹果和安卓(ios和android)合成一个二维码的工具. 因为这个不难,主要是根据浏览器的UA进行判断,所以就自己开发了一个网站 网站名称叫:好推二维码  https ...

  7. Android APP压力测试(二)之Monkey信息自动收集脚本

      Android APP压力测试(二) 之Monkey信息自动收集脚本 前言: 上一篇Monkey介绍基本搬抄官方介绍,主要是为了自己查阅方便.本文重点介绍我在进行Monkey时如何自动收集相关信息 ...

  8. Android项目实战(二十八):Zxing二维码实现及优化

    前言: 多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意. 当然,项目中我们也许只会用到二维码的扫描和生成两个功能,所以不必下载完整的ja ...

  9. Android多线程分析之二:Thread的实现

    Android多线程分析之二:Thread的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处   在前文<Android多线程分析之一 ...

随机推荐

  1. Hadoop的eclipse1.1.2插件的安装和配置

    我的集群使用的hadoop版本是hadoop-1.1.2.对应的eclipse版本也是:hadoop-eclipse-plugin-1.1.2_20131021200005 (1)在eclipse的d ...

  2. Linux主从同步监测和利用sendMail来发邮件

    首先介绍下sendMail About SendEmailSendEmail is a lightweight, command line SMTP email client. If you have ...

  3. PageObjects 设计模式

    什么是Page Objects(翻译为:页面对象?)… 简单的说,Page Objects是指UI界面上用于与用户进行交互的对象.它可以指整个页面,也可以指Page上的某个区域.Page Object ...

  4. Java Web专题

  5. CodeForces - 987D Fair (BFS求最短路)

    题意:有N个城市,M条双向道路连接两个城市,整个图保证连通.有K种物品,但每个城市只有一种,现在它们都需要S种物品来举办展览,可以去其他城市获取该城市的物品,花费是两城市之间的最短路径长度.求每个城市 ...

  6. Java乐观锁的实现原理(案例)

    简要说明: 表设计时,需要往表里加一个version字段.每次查询时,查出带有version的数据记录,更新数据时,判断数据库里对应id的记录的version是否和查出的version相同.若相同,则 ...

  7. Hive2.2.1安装使用

    解压缩hive安装包tar zxvf apache-hive-2.1.1-bin.tar.gz 安装mysqlsudo yum install mysql-server 安装 mysql connec ...

  8. SQL语句2

    1. SELECT * FROM Persons WHERE City NOT LIKE '%lon%' 2. SELECT * FROM Persons WHERE FirstName LIKE ' ...

  9. DateTable To Json

    private string aaaa(DataTable dt) { JavaScriptSerializer javaScriptSerializer = new JavaScriptSerial ...

  10. Linux 上下左右键变成^A,^B,^C,^D解决方法

    用gedit打开 /etc/vim/vimrc.tiny,将里面的 set compatible 改成 set nocompatible 对于退格键backspace的问题,只需在刚才那句话下面加上一 ...