Android Handler消息传递机制

原创 2016年08月31日 12:27:32

Android的UI操作不是线程安全的,所以多线程并发操作UI组件可能导致线程安全问题,所以规定:只允许在主线程中修改UI组件

Android的Handler消息传递机制解决了Android 的多线程问题,Handler是在主线程和子线程之间 传递信息的,就是两个线程间的“传话员”

Handler类主要作用是;1.在新线程中发送消息,2.在主线程中获取处理消息

在开发中要重写Handler的处理消息方法,当新线程启动发送消息时,消息会发送到关联的MessageQueue中,Handler会不断地从MessageQueue中获取并处理消息

Handler的handleMessage(Message msg)用于处理消息,任然在主线程中,新线程用sendMessage(Message msg)发送消息

子线程中sendMessage发送,在Handler或者Handler子类中使用handleMessage来处理消息实现主线程和子线程通讯

public class MainActivity extends Activity implements android.view.View.OnClickListener {

	private Button button;
	private TextView textView;
	private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button =(Button)findViewById(R.id.buttonId);
        textView = (TextView)findViewById(R.id.textViewId);
        //主线程中接收处理消息
        Handler handler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				String s = (String)msg.obj;
				textView.setText(s);
			}
		};
        
        button.setOnClickListener(new OnClickListener(this));
        
    }
	
    @Override
	public void onClick(View v) {
		// 开启新线程并发送消息
		new NetThread(new Runnable(){
			@Override
			public void run() {
				// 模拟访问网路
				super.run();
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				String s = "从网络获取的数据";
				Message msg = handler.obtainMessage();
				msg.obj = s;
				handler.sendMessage(msg);
				
			}
		}).start();	
	} 
}

·

Handler、Loop、MessageQueue的工作原理

Handler组件:

Message:消息对象,用于Handler接受处理

Looper:每个线程只能有一个Looper负责读取MessageQueue的消息,并发送给Handler

MessageQueue:管理Message

Handler正常工作在当前线程必须有一个Looper对象,Handler handler = new Handler();相当于Handler handler = new Handler(Looper.myLooper);

保证当前线程有Looper对象,可以有两种方法:

1.在主线程中初始化一个Looper对象,程序可直接创建Handler

2.自己创一个Looper对象并启动他,调用prepare()即可


在线程中使用Handler的步骤:

1.调用Looper的prepare()创建Looper对象

2.创建Handler子类的实例,重写handleMessage()方法

3.调用Looper的loop()方法启动

public class MainActivity extends Activity {

	private Button button;
	private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button = (Button)findViewById(R.id.buttonId);
        button.setOnClickListener(new OnClickListener(){
			
			@Override
			public void onClick(View v) {
				System.out.println(Thread.currentThread().getName());
				Message msg = handler.obtainMessage();
				handler.sendMessage(msg);
			}
		});      
		
        WorkThread wt = new WorkThread();	//创建新线程
        wt.start();
    }

    class WorkThread extends Thread{
		@Override
		public void run() {
			Looper.prepare();	//1.创建Looper对象对象
			handler = new Handler(){	//2.创建Handler子类实例
				public void handleMessage(Message msg) {
					//处理方法
				}
			};
			Looper.loop();	//3.启动Looper
		}
    	
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

解析Android的消息传递机制Handler

1. 什么是Handler: Handler 网络释义“操纵者,管理者的”意思,在Android里面用于管理多线程对UI的操作; 2. 为什么会出现Handler: 在Android的设...
  • kekeleqy
  • kekeleqy
  • 2016年08月18日 11:10
  • 753

android studio for android learning (十九 ) 最新Handler消息传递机制全解

1.Android制定了一条简单的原则:只允许UI线程(亦即主线程)修改Activity中的UI组件。当一个程序第一次启动时,Android会同时启动一条主线程,主线程主要负责处理与UI相关的事件,如...
  • yywan1314520
  • yywan1314520
  • 2016年07月17日 20:51
  • 2471

Android四种常用的消息传递机制/模式的比较

四种分别是callback interface,handler-message,broadcast receiver和observer-subject。
  • zy13608089849
  • zy13608089849
  • 2017年07月07日 18:51
  • 324

Handler消息传递机制(一)

为什么要用Handler: 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题。为了解决这个问题,Android制定了一条简单的原...
  • tuke_tuke
  • tuke_tuke
  • 2016年03月02日 21:09
  • 1256

Handler消息传送机制总结

Handler类的主要作用: 1.在子线程中发送数据。 2.在主线程中接收数据,处理数据。 这个过程和使用的方法都是我们要理解的...
  • wenzhi20102321
  • wenzhi20102321
  • 2016年10月17日 12:50
  • 2514

android消息传递机制---handler

出于性能优化考虑,Android的UI线程操作并不是安全的,也就是说,几个线程同时操作UI可能会导致线程安全问题,为了解决这个问题,android规定只有UI线程也就是主线程才能修改UI界面,那么当其...
  • qq_31156769
  • qq_31156769
  • 2016年03月31日 00:23
  • 174

Android消息传递机制浅析

1.Looper、Handler、MessageQueue的关系 Looper 用于线程的消息循环,一个线程只能有一个Looper对象 Handler 执行任务调度和发生一些操作(在未来某时刻) 执...
  • qq_21430549
  • qq_21430549
  • 2016年05月03日 20:31
  • 2155

android Handler 消息传递机制

视频播放地址:http://v.youku.com/v_show/id_XNzMzNTc2ODg0.html
  • u010134178
  • u010134178
  • 2014年07月08日 18:13
  • 520

Android:Handler消息传递机制

一、存在Handler类的背景: 当一个Android程序第一次启动时,Android会同时启动一个主线程(Main Thread),主线程主要负责处理与UI相关的事件。因此,可以理解为执行UI操...
  • abvedu
  • abvedu
  • 2015年07月30日 20:18
  • 380

Android Handler消息传递机制

今天介绍一下Android的消息传递机制Handler,Handler是另一种形式的“事件处理”,这种机制主要是为了解决Android应用的多线程问题---Android平台不允许Activity新启...
  • panhongjin
  • panhongjin
  • 2013年10月09日 13:01
  • 451
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Handler消息传递机制
举报原因:
原因补充:

(最多只允许输入30个字)