Handler原理解析

一、Android消息机制

Android的消息机制主要是指Handler的运行机制,Handler是Android消息机制的上层接口,在Android开发中,我们可以通过Handler轻松的将一个任务切换到Handler所在的线程中去执行。可以作为线程间的一种通信方式,也常用来更新UI。举个🌰:

当我们需要在子线程中进行耗时的I/O操作,可能是读取文件或者访问网络等,当耗时操作完成时,我们需要在UI上做一些改变,由于Android中子线程不能直接访问UI控件,否则会触发异常,这个时候我们就可以通过Handler将更新UI的操作切换到主线程中执行。

public class TestHandlerActivity extends Activity{
	
	//在主线程中创建handler
	private static Handler mHandler = new Handler()@Override
	protected void onCreate(Bundle saveInstanceState){
		super onCreate(saveInstanceState);
		setContentView(R.layout.test_handler_activity);

		Button btn = findViewById(R.id.btn_test);
		btn.setOnClickListener(new View.OnClickListener(){
			
			@Override
			public void OnClick(View v){
				//开启子线程
				new Thread (new MyThread()).start();
			}
		});
	}

	public class MyThread implements Runable{

		@Override
		public void run(){
			//进行耗时的IO操作,读取文件或访问网络等
			...

			//用handler更新UI
			mHandler.post(new Runable(){
				@Override
				public void run(){
					//更新UI
					...
				}
			});
		}	
	}
}

二、Handler机制的主要角色

  • Message:handle接受和处理的消息对象,包含消息ID,消息处理对象和处理的数据等
  • Handler:主要负责消息的发送和处理
  • MessageQueue:采用单链表的存储形式,主要负责消息的接收和存储
  • Looper:主要负责从MessageQueue中提取消息并交由Handle进行处理

整个运行流程如下图所示:
Handler运行机制图解
在Handler创建完毕后,这个时候Handler所属线程内部的Looper以及MessageQueue就可以和Handler一起协同工作了,然后通过Handler的post方法将一个Runable投递到Handler所属线程内部的Looper中去处理,也可以通过Handler的send方法发送一个消息到Handler所属线程内部的Looper中去处理。其实post方法最终也是通过send方法来完成的,而当send方法被调用时,它会调用MessageQueue的enqueueMessage方法将这个消息放入消息队列中;而Looper会不断调用MessageQueue的next方法来获取新方法,当MessageQueue中没有消息时,next会被阻塞(wait),当next有新消息到来时,Looper就会处理这个消息,也就是发送这条消息的handler的dispatchMessage方法,dispatchMessage方法会先检查message中是否含有post进来的runable是否为null,如果不为null就执行runable,否则调用handler的handleMessage方法。由于Looper是运行在创建Handler所在的线程中的,这样一来Handler中的业务逻辑就被切换到创建Handler所在的线程中去执行了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值