Android多线程之图解Handler Looper MessageQueue Message

Android中的多线程可以有多种实现方式,前面我们已经讲过了封装程度较高异步任务(AnsyncTask),这一节我们来看看较为灵活的方式:Handler Looper MessageQueue Message。

  • Message:用于线程之间传递信息,发送的消息放入目标线程的MessageQueue中。
  • MessageQueue:用于简化线程之间的消息传递,MessageQueue接受发送端的Message,并作为消息处理端的输入源。每个线程只有一个实例。
  • Handler:用于处理Message。根据业务需要每个线程可以有多个实例。
  • Looper:每个线程中只有一个Looper(但是工作线程默认不创建Looper),它是一个循环,不断的从MessageQueue中取出Message,发送给Handler处理。

如图所示,一个线程中只有一个Looper实例,一个MessageQueue实例,可以有多个Handler实例。

下图示意了Handler、MessageQueue、Looper之间是如何协作的。

图中蓝色的部分在一个线程中,绿色的可能在另一个线程中。

下面写一个小示例演示一下如何使用,当按钮第一次按下时创建一个线程,这个线程会不断的通知界面上的一个进度条跟新进度,当按钮再次按下时又会创建一个新的线程,该线程会推进第二个进度条前进。

package com.example.katahandler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class MainActivity extends Activity {

	Button mButton;
	ProgressBar mProgressBar;
	ProgressBar mProgressBar2;
	static final int PROGRESS_VALUE1 = 1;
	static final int PROGRESS_VALUE2 = 2;
	int mClickCount = 0;
	class MyHandler extends Handler{

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			//区分消息的种类
			if ( msg.what == PROGRESS_VALUE1 ){
				mProgressBar.setProgress(msg.arg1);
				super.handleMessage(msg);
			}
			else if ( msg.what == PROGRESS_VALUE2 ){
				mProgressBar2.setProgress(msg.arg1);
				super.handleMessage(msg);
			}
		}
	}
	MyHandler handler;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
		mProgressBar2 = (ProgressBar) findViewById(R.id.progressBar2);
		mButton = (Button) findViewById(R.id.button1);
		mButton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				mClickCount++;

				new Thread(){
					@Override
					public void run() {
						int what = 0;
						if(mClickCount==1)
							what = PROGRESS_VALUE1;
						else if(mClickCount==2)
							what = PROGRESS_VALUE2;

						for(int i = 0;i<100;i++){
							try {
								sleep(100);
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}

							Message msg = handler.obtainMessage(what, i+1, 0);
							handler.sendMessage(msg);
						}
						super.run();
					}
				}.start();
			}
		});
		handler = new MyHandler();
	}
}
  1. 首先在代码中自定义自己的Handler类MyHandler,重写handlerMessage函数用于处理接受到的消息。
  2. 按钮点击事件中创建一个Thread实例,重写它的run方法。
  3. 在Thread的run方法中,工作线程不断的向handler发送消息,注意这里,Message不要用new方法创建,要使用handler.obtainMessage方法创建,因为这里有做对象池的优化,防止大量消息产生的内存碎片。
  4. 在这里没有看到Looper,是因为在UI线程中已经存在了Looper,我们不需要对Looper做操作,如果我们的handler存在于一个工作线程中,我们必须在该工作线程适当的位置调用Looper.prepare()和Looper.loop()。

执行效果如下:

转载请注明出处:Android多线程之图解Handler Looper MessageQueue Message

时间: 2024-08-03 15:17:26

Android多线程之图解Handler Looper MessageQueue Message的相关文章

转载:android笔记--android中的多线程--Handler, Looper, MessageQueue, Message类

什么时候使用多线程: 1. 耗时操作使用多线程, 耗时操作放在UI线程中会导致用户的操作无法得到响应. 2. 阻塞操作使用多线程, 理由同上. 3. 多核CUP的设备使用多线程, 可以有效提高CPU的利用率. 4. 并行操作使用多线程. android中的多线程模型主要涉及的类有:Looper, Handler, MessageQueue, Message等. 一:Looper类: 1 static final ThreadLocal<Looper> sThreadLocal = new Th

线程间通信: Handler , Looper, MessageQueue, Message (完结)

概述:    为了 线程间 通信方便, Handler 机制 通过 Handler 和 Looper, MessageQueue, Message 这些 类 之间的协作, 简化 多线程的开发.  线程的交互 会被封装 到 Message 中, 然后 通过 Handler 的方法 把 消息 放到 MessageQueue 消息队列中, 实现 Handler 机制的线程 都会 调用 Looper 的 loop() 方法, 则 Looper 作为 消息分发者的 作用就体现出来了.  loop() 方法

Android消息传递源码理解。Handler,Looper,MessageQueue,Message

Android中消息传递模块差不多看了好几次,虽然每次看的方式都差不多但是还是发觉的到每次看了之后,理解的更清晰一点. 关于这个模块的文章数不胜数,但是最重要的还是自己动手理解一遍更好. 会牵扯到的几个类: Handler.java  , Looper.java , MessageQueue.java , Message.java 源代码路径: xxx/frameworks/base/core/java/android/os  看的过程中你会发现高版本和低版本系统代码有些地方比较大的差距.从中我

Android异步处理三:Handler+Looper+MessageQueue深入详解

Android Loop&Handle学习总结 - New Start - 博客频道 - CSDN.NET ?????? 昨晚偷懒,这篇博客只写了一个标题,今天早晨一看,还有15的阅读量.实在是对不起那些同学.......换了是我,也会BS这样的LZ吧!sorry 啦 -------------------------------------------------------------------------------------------------------------------

Android中的Handler, Looper, MessageQueue和Thread

Android中的Handler, Looper, MessageQueue和Thread 前几天,和同事探讨了一下Android中的消息机制,探究了消息的发送和接收过程以及与线程之间的关系.虽然我们经常使用这些基础的东西,但对于其内部原理的了解,能使我们更加容易.合理地架构系统,并避免一些低级错误. 对于这部分的内容,将分成4小节来描述: 1.职责与关系 2.消息循环 3.线程与更新 4.几点小结 ------------------------------------------------

Android多线程编程之Handler篇(消息机制)

Android多线程编程之Handler篇(消息机制) Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑. MessageQueue 消息队列,以队列的形式(实为单链表结构)对外提供插入和删除的工作, Looper 以无限循环的形式不断获取MessageQueue中的消息,有则处理,无则等待. ThreadLocal ThreadLocal可以在不同的线程互不干扰的存储并提供数据,通过ThreadLocal可以很

Android消息机制:Looper,MessageQueue,Message与handler

Android消息机制好多人都讲过,但是自己去翻源码的时候才能明白. 今天试着讲一下,因为目标是讲清楚整体逻辑,所以不追究细节. Message是消息机制的核心,所以从Message讲起. 1.Message是什么? 看一个从消息池中取出一个msg的方法: public static Message obtain(Handler h, int what, int arg1, int arg2, Object obj) { Message m = obtain(); m.target = h; m

Android消息机制探索(Handler,Looper,Message,MessageQueue)

概览 Android消息机制是Android操作系统中比较重要的一块.具体使用方法在这里不再阐述,可以参考Android的官方开发文档. 消息机制的主要用途有两方面: 1.线程之间的通信.比如在子线程中想更新UI,就通过发送更新消息到UI线程中来实现. 2.任务延迟执行.比如30秒后执行刷新任务等. 消息机制运行的大概示意图如下: 一个线程中只能有一个Looper对象,一个Looper对象中持有一个消息队列,一个消息队列中维护多个消息对象,用一个Looper可以创建多个Handler对象,Han

Android消息机制(Handler、MessageQueue、Looper)详细介绍

Android的消息机制其实在android的开发过程中指的也就是Handler的运行机制,这也就引出了android中常见的面试问题: 简述Handler.Looper.MessageQueue的含义,以及它们之间的关系 简述Handler的运行机制 说明Handler.Looper以及Message之间的关系 Handler机制为什么这么重要呢? 我们知道android设备作为一台移动设备,不管是内存或者还是它的性能都会受到一定的限制:过多的使用内存会使内存溢出(OOM):另外一方面,大量的