欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android Handler主线程和一般线程通信的应用分析

程序员文章站 2023-11-28 23:06:16
handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新ui.解释: 当应用程序启动时,android首先会开启一个主线程 (也就是ui线程) , 主线程...

handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新ui.
解释: 当应用程序启动时,android首先会开启一个主线程 (也就是ui线程) , 主线程为管理界面中的ui控件,进行事件分发, 比如说, 你要是点击一个 button ,android会分发事件到button上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到android系统的一个错误提示"强制关闭"。这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到ui更新,android主线程是线程不安全的,也就是说,更新ui只能在主线程中更新,子线程中操作是危险的。这个时候,handler就出现了来解决这个复杂的问题。由于handler运行在主线程中(ui线程中),  它与子线程可以通过message对象来传递数据, 这个时候,handler就承担着接收子线程传过来的(子线程用sedmessage()方法传递)message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新ui。

handler一些特点
handler可以分发message对象和runnable对象到主线程中, 每个handler实例,都会绑定到创建他的线程中(一般是位于主线程)。
它有两个作用: (1)、安排消息或runnable在某个主线程中某个地方执行;(2)安排一个动作在不同的线程中执行。

        handler中分发消息的一些方法
        post(runnable)
        postattime(runnable,long)
        postdelayed(runnable long)
        sendemptymessage(int)
        sendmessage(message)
        sendmessageattime(message,long)
        sendmessagedelayed(message,long)
        以上post类方法允许你排列一个runnable对象到主线程队列中,
        sendmessage类方法, 允许你安排一个带数据的message对象到队列中,等待更新.

要更改ui界面内容只能在主线程里面进行,下面是一个实现在android中,动态更改ui界面的内容:先启动一个线程timer,此线程负责对ui进行动态更改的具体操作,此外,再定义一个线程来负责主线程和timer线程的通信,此线程就是handler!它是runnable和activity交互的桥梁。

步骤:

1、在mainactivity中定义操作title具体实现

private int title = 0;

	protected void updatetitle() {
		settitle("welcome to livingstone's blog" + title);// mainactivity中更新title方法
		title++;
	}

2、在mainactivity中定义一个handler,用于更新title

	private handler changetitlehandler = new handler() {
		@override
		public void handlemessage(message msg) {
			switch (msg.what) {
			case 1:
				updatetitle();
				break;
			}
		}
	};

3、在mainactivity中定义一个timertask类型内部类,此task继承自runnable! 

	private class mytack extends timertask {// public abstract class timertask implements runnable{}
		@override
		public void run() {
			message msg = new message();
			msg.what = 1;
			changetitlehandler.sendmessage(msg);
		}
	}

4、在mainactivity的oncreate方法中添加一个定时器

timer timer = new timer();
timer.scheduleatfixedrate(new mytack(), 1, 5000);// 方法详解 timer.scheduleatfixedrate(timertask task, long delay, long period)

* @param task | the task to schedule.
* @param delay | amount of time in milliseconds before first execution.
* @param period | amount of time in milliseconds between subsequent executions.

ok!
执行此activity,会看到一个title动态更新的程序。

handler的使用场合:

1、 to schedule messages and runnables to be executed as some point in the future;

      安排messages和runnables在将来的某个时间点执行。

2、 to enqueue an action to be performed on a different thread than your own.

      将action入队以备在一个不同的线程中执行。即可以实现线程间通信。比如当你创建子线程时,你可以在你的子线程中拿到主线程中创建的handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于android要求在ui线程中更新界面,因此,可以通过该方法在其它线程中更新界面。

1)、创建handler对象(此处创建于主线程中便于更新ui)。

2)、构建runnable对象,在runnable中更新界面。

3)、在子线程的run方法中向ui线程post,runnable对象来更新ui,handler.post(runnable runa)。