Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue

转载 2014年04月16日 09:19:17
当一个程序第一次启动时,Android会启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如按键事件、触屏事件、绘图事件,主线程也被称为UI线程。
UI的操作只能是通过主线程来操作,为了解决多线程操作UI的问题,就用到了Handler类。
一、Handler类
Handler类的作用有两个:
1、在新启动的线程中发送消息。
2、在主线程中获取、处理消息。
例如:
  1. package com.example.testlistener;  
  2.   
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5.   
  6. import android.app.Activity;  
  7. import android.content.res.Configuration;  
  8. import android.os.Bundle;  
  9. import android.os.Handler;  
  10. import android.os.Message;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.view.View.OnLongClickListener;  
  14. import android.widget.Button;  
  15. import android.widget.EditText;  
  16. import android.widget.Toast;  
  17.   
  18. public class MainActivity extends Activity {  
  19.     EditText txt;  
  20.     final Handler hander = new Handler(){  
  21.         public void handleMessage(android.os.Message msg) {  
  22.             if(msg.what == 0x1234){  
  23.                 Toast.makeText(MainActivity.this, msg.arg1 + ""1000).show();  
  24.             }  
  25.         };  
  26.     };  
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.activity_main);  
  31.           
  32.         new Timer().schedule(new TimerTask() {  
  33.             int i = 0;  
  34.             @Override  
  35.             public void run() {  
  36.                 i++;  
  37.                 Message msg = new Message();  
  38.                 msg.what = 0x1234;  
  39.                 msg.arg1 = i;  
  40.                 hander.sendMessage(msg);  
  41.             }  
  42.         }, 02000);  
  43.     }  
  44.       
  45. }  
Message是Hander接收和处理的消息对象。通过向Message中添加消息,将消息放入消息队列MessageQueue,然后通过Looper方法读取MessageQueue。
打开Android系统源码可以看到:
  1. private Looper() {  
  2.     mQueue = new MessageQueue();  
  3.     mRun = true;  
  4.     mThread = Thread.currentThread();  
  5. }  
程序创建时Looper会在它的构造器中创建MessageQueue对象。
handlerMessage方法位于主线程,可以处理UI.
二、Handler、Looper、MessageQueue的工作原理
Looper:每个线程只有一个Looper,负责管理MessageQueue,会不断地从MessageQueue中取出消息,并将消息分给对应的Handler处理。
MessageQueue:由Looper负责管理,采用先进先出的方式管理Message(消息队列).
Handler:把消息发送给Looper管理的MessageQueue并负责处理Looper分给它的消息。
为了保证当前线程中有Looper对象,有如下两种情况:
1、主UI线程中,系统已经初始化了一个Looper对象,因此程序直接创建Handler即可。
2、自己定义的子线程,必须先创建一个Looper对象,并启动它。
例如:将上面的例子加以修改
  1. package com.example.testlistener;  
  2.   
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5.   
  6. import android.app.Activity;  
  7. import android.content.res.Configuration;  
  8. import android.os.Bundle;  
  9. import android.os.Handler;  
  10. import android.os.Looper;  
  11. import android.os.Message;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.view.View.OnLongClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.EditText;  
  17. import android.widget.Toast;  
  18.   
  19. public class MainActivity extends Activity {  
  20.     EditText txt;  
  21.     Button bt;  
  22.     TestThread testThread;  
  23.     int j = 0;  
  24.     final Handler hander = new Handler(){  
  25.         public void handleMessage(android.os.Message msg) {  
  26.             if(msg.what == 0x1234){  
  27.                 Toast.makeText(MainActivity.this, msg.arg1 + ""1000).show();  
  28.             }  
  29.         };  
  30.     };  
  31.     @Override  
  32.     protected void onCreate(Bundle savedInstanceState) {  
  33.         super.onCreate(savedInstanceState);  
  34.         setContentView(R.layout.activity_main);  
  35.         txt = (EditText) findViewById(R.id.txt);  
  36.         bt = (Button) findViewById(R.id.bn);  
  37.         testThread = new TestThread();  
  38.         testThread.start();  
  39.         bt.setOnClickListener(new OnClickListener() {  
  40.               
  41.             @Override  
  42.             public void onClick(View arg0) {  
  43.                 j++;  
  44.                 Message msg = new Message();  
  45.                 msg.what = 0x1000;  
  46.                 msg.arg1 = j;  
  47.                 testThread.thander.sendMessage(msg);  
  48.             }  
  49.         });  
  50.           
  51.         new Timer().schedule(new TimerTask() {  
  52.             int i = 0;  
  53.             @Override  
  54.             public void run() {  
  55.                 i++;  
  56.                 Message msg = new Message();  
  57.                 msg.what = 0x1234;  
  58.                 msg.arg1 = i;  
  59.                 hander.sendMessage(msg);  
  60.             }  
  61.         }, 02000);  
  62.     }  
  63.       
  64.     //自定义子线程  
  65.     class TestThread extends Thread{  
  66.         public Handler thander;  
  67.         @Override  
  68.         public void run() {  
  69.             //创建一个Looper对象  
  70.             Looper.prepare();  
  71.             thander = new Handler(){  
  72.                 @Override  
  73.                 public void handleMessage(Message msg) {  
  74.                     if(msg.what == 0x1000){  
  75.                         System.out.println("j = " + msg.arg1);  
  76.                         //txt.setText(msg.arg1 + "");  
  77.                     }  
  78.                 }  
  79.             };  
  80.             //启动Looper  
  81.             Looper.loop();  
  82.         }  
  83.     }  
  84.       
  85. }  
运行结果:

Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue

当一个程序第一次启动时,Android会启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如按键事件、触屏事件、绘图事件,主线程也被称为UI线程。 UI的操作只能是通过主线...
  • lxq_xsyu
  • lxq_xsyu
  • 2014年02月18日 09:06
  • 3390

Android中的Handler机制(一)

转载出处:http://blog.csdn.net/stonecao/article/details/6417364  在android中提供了一种异步回调机制Handler,使用它,我们可以...
  • u010779707
  • u010779707
  • 2016年04月21日 11:02
  • 268

Handler、Message、Loop消息队列模型,各部分的作用

Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列(Message Queue)和一个消息循环(Looper)。Android中除了UI线程(主...
  • longlyboyhe
  • longlyboyhe
  • 2016年06月23日 15:31
  • 1503

深入Android的消息机制源码详解~Handler,MessageQueue与Looper关系

一说到Android的消息机制,自然就会联想到Handler,我们知道Handler是Android消息机制的上层接口,因此我们在开发过程中也只需要和Handler交互即可,很多人认为Handler的...
  • javazejian
  • javazejian
  • 2016年03月04日 23:25
  • 1903

Android菜鸟的成长笔记(25)——可爱的小闹钟

摘要:这一篇主要使用系统为我们提供的一个服务AlarmManager来制作一个Android小闹钟,同时还涉及到了自定义主题、判断第一次启动应用、自定义动画、对话框、制作指导滑动页面等方面。最后形成一...
  • lxq_xsyu
  • lxq_xsyu
  • 2014年02月26日 13:26
  • 7761

Handler的实现原理及其与Message、MessageQueue关系详解

在Android中为我们提供了一个主线程和子线程之间的通信机制,这种机制就是利用Handler、Message、Looper和MessageQueue来彼此联系起来的。那么为什么要提供这么一种机制呢?...
  • u012481172
  • u012481172
  • 2015年08月13日 15:39
  • 1256

MessageQueue&Message Pool—消息的读写、删除和回收

1、MessageQueue的数据结构 翻译为消息队列,但实际的数据结构是单向链表结构,下文中仍以消息队列称之; Message中有个重要的属性Message next;next指向另外一个Messa...
  • u012164786
  • u012164786
  • 2016年06月12日 02:50
  • 1098

Android之学习安卓每天成长笔记

8月7日 1 、安装了反编译工具 jad  net.sf.jadclipse_3.3.0.jar 或者在help install software http://feeling.sourceforge...
  • u011068702
  • u011068702
  • 2015年08月19日 11:26
  • 1132

菜鸟程序员的成长之路(一)——菜鸟程序员起步

看到标题之后,突然想起一句文的话:白驹过隙,时光荏苒。每当看到这么有文采的话,总觉得有点酸,再酸我也用*^◎^*。        9月开学季,大家陆续返校,让我想起了三年前自己带着新奇与憧憬步入大学,...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2013年09月02日 15:56
  • 7971

关于Handler的拦截

为什么要Hook Handler?Android系统中存在大量Handler,我们要改变系统的某些行为就需要Hook掉一些关键节点的Handler,为此,我们要清楚Handler的工作原理。先做一个实...
  • dingjikerbo
  • dingjikerbo
  • 2016年02月16日 11:14
  • 1250
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue
举报原因:
原因补充:

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