Handler 机制详解

本文深入解析了Android中Handler的工作原理,包括Looper、Message和Message Queue的关系,并提供了三种创建Handler的具体实例,帮助读者理解如何实现跨线程更新UI及消息处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概述:

handler是安卓提供的一套更新UI的机制,由于android不允许非UI线程更新UI,所以需要相关机制实现。同时hander也是一套消息处理机制,能实现主线程向子线程传递消息,子线程向主线程传递消息。


2.Looper、Message和Queue的关系

Looper是一个消息分发器,在主线程创建的时候就会创建一个Looper对象
messageQueue :消息队列,是由message组成的一个 队列

handler:从messageQueue中获取到message,然后执行动作,可以再主线程和子线程中互相传递数据  

在主线程创建之后会创建一个Looper对象,创建Looper对象的时候会去创建一个messageQueue,而Looper是一个轮询器,会不停的轮询messageQueue中的消息,在获取到消息之后就会把这个消息交给handler来进 行处理,在主线程中创建一个handler对象,这个handler对象不仅可以获取到消息进行处理,也可以把一个消息放到消息队列中。



3.处理消息的顺序

首先是执行message中的回调方法Callback, 如果返回false 则执行Handler中的CallBack接口,返回message则执行HandlerMessage(里面的函数由开发者在其子类中实现)

     4.实现handler的三种方式

1.使用主线程默认构造函数handler()由线程。Looper在主线程中

package com.example.handertest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView tv;
	private static final int UPDATE = 0;
	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {

			switch (msg.what) {
			case UPDATE:
				tv.setText(String.valueOf(msg.obj));
				break;

			default:
				break;
			}
		}
};
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//TextView tv;
		setContentView(R.layout.activity_main);
		tv=(TextView) findViewById(R.id.tv1);
		new Thread(){
			public void run(){
				for(int i=0;i<100;i++){
					try {
						Thread.sleep(1000);
						Message msg=new Message();
						msg.what=UPDATE;
						msg.obj="更新后的内容"+i;
						handler.sendMessage(msg);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					Message msg=new Message();
					msg.what=UPDATE;
					msg.obj="更新后的内容"+i;
					handler.sendMessage(msg);
				}
			}
		}.start();
		
	}
}

2.在主线程中创建handler指定主线程外的Looper

3.LooperThread主线程创建的handler运行在其中

package com.example.handertest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.widget.TextView;
/*
 * 
 * 第2⃣️种为主线程中的handler指定Looper
 */
public class Handler_Thread extends Activity {
	
	private static final int UPDATE = 0;
	private TextView  textView;
	private HandlerThread thread;
	private Handler handler;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textView=(TextView)findViewById(R.id.tv1);
		
		textView.setText("handlerThread");
		//setContentView(R.layout.activity_main);
		//thread=new HandlerThread("handler Thread");
		//thread.start();
		handler =new Handler();
		handler=new Handler(handler.getLooper()){
				
			@Override
			public void handleMessage(Message msg) {
				//Message message=new Message();
				//handler.sendMessageDelayed(message, 2110);
				
				//super.handleMessage(msg);
				switch (msg.what) {
				case UPDATE:
					textView.setText(String.valueOf(msg.obj));
					break;

				default:
					break;
				}
			}		
		};
		
		new Thread(){
			public void run(){
				for(int i=0;i<100;i++){
					try {
						Thread.sleep(1000);
						Message msg=new Message();
						msg.what=UPDATE;
						msg.obj="更新后的内容"+i;
						handler.sendMessage(msg);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					Message msg=new Message();
					msg.what=UPDATE;
					msg.obj="更新后的内容"+i;
					handler.sendMessage(msg);
				}
			}
		}.start();
	}
}



Handler发送的消息可以运行在别的线程的上下文,但是其处理消息都是在其对应的Looper所在的宿主线程。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值