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. }  
运行结果:

Python全栈工程师-第12周

-
  • 1970年01月01日 08:00

Handler类和Handler,Loop,MessageQueue的工作原理

Handler类的作用主要有两种: 1.在新启动的线程中发送消息。 2.在主线程(UI线程)中获取,处理消息。 注:主线程已经封装有Loop的消息队列处理机制,无需再创建。 Handler类包含如下方...
  • xiyangyang8
  • xiyangyang8
  • 2016-02-27 13:55:10
  • 705

Android Handler MessageQueue Loop Message之间的关系以及消息发送响应流程

Handler MessageQueue Loop Message之间的关系
  • guibao513
  • guibao513
  • 2016-11-02 18:25:15
  • 237

第五课:Android中Handler、Loop、MessageQueue的工作原理和使用方法

Message:Handler接收和处理的消息对象。 Looper:
  • sollor525
  • sollor525
  • 2014-07-30 12:14:40
  • 599

Handler、Loop、MessageQueue的关系

Looper:    每个线程只有一个Looper,它负责管理MessageQueue,会不断从MessageQueue中取出消息,并将消息分给对应的Handler处理 MessageQueue: ...
  • yangyao_iphone
  • yangyao_iphone
  • 2016-04-18 16:11:48
  • 305

Message、Handler、Message Queue、Looper之间的关系

 Handler简介: 一个Handler允许你发送和处理Message和Runable对象,这些对象和一个线程的MessageQueue相关联。每一个线程实例和一个单独的线程以及该线程的...
  • qq_19827707
  • qq_19827707
  • 2016-05-27 16:50:29
  • 420

Android中的Handler机制(一)

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

Android中Thread、Handler、Looper、MessageQueue的原理分析

Android中Thread、Handler、Looper、MessageQueue的原理分析
  • bboyfeiyu
  • bboyfeiyu
  • 2014-08-14 16:02:40
  • 11699

Android Thread,Handler,Loop,Message,HandlerThread总结

问题: 1:Handle Thread Loop,MessageQueue的关系,他们是如何绑定的?2:怎么指定线程处理Handle 发送的消息?3:HandlerThread 与Thread 的区...
  • lqb3732842
  • lqb3732842
  • 2017-02-09 14:50:25
  • 614

Android之Handler、MessageQueue、Message、Messager与Looper关系

android应用程序主线程即UI线程中组件的属性值的更新不能由子线程来更改,所以此时出现了Handler这个中介来解决这个问题,Handler在子线程中发送Message或Runnable到与UI线...
  • baipeng298
  • baipeng298
  • 2015-07-08 17:18:17
  • 480
收藏助手
不良信息举报
您举报文章:Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue
举报原因:
原因补充:

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