Handler 机制详解

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所在的宿主线程。




猜你喜欢

转载自blog.csdn.net/u013741019/article/details/45010709