Android 的消息机制(2)

简介:

上一节中,是主线程自己发了一个消息到自己的Message Queue中,并把消息从队列中提取出来。那么如何由别的线程发送消息给主线程的Message Queue中呢?

直接看代码~~?[Copy to clipboard]Download zuiniuwang.java

 

 
  1. <span style="font-size: 14px">/**  
  2.  * MessageQueue2.java  
  3.  * com.test  
  4.  *  
  5.  * Function: TODO  
  6.  *  
  7.  *   ver     date           author  
  8.  * ──────────────────────────────────  
  9.  *           2011-3-20      Leon  
  10.  *  
  11.  * Copyright (c) 2011, TNT All Rights Reserved.  
  12. */  
  13.    
  14. package com.test;  
  15. /**  
  16.  * ClassName:MessageQueue2  
  17.  * Function: TODO ADD FUNCTION  
  18.  * Reason:   TODO ADD REASON  
  19.  *  
  20.  * @author   Leon  
  21.  * @version  
  22.  * @since    Ver 1.1  
  23.  * @Date     2011-3-20  
  24.  */  
  25. import android.app.Activity;  
  26. import android.graphics.Color;  
  27. import android.os.Bundle;  
  28. import android.os.Handler;  
  29. import android.os.Looper;  
  30. import android.os.Message;  
  31. import android.view.View;  
  32. import android.view.View.OnClickListener;  
  33. import android.widget.Button;  
  34. import android.widget.LinearLayout;  
  35. import android.widget.TextView;  
  36.    
  37. public class MessageQueue2 extends Activity implements OnClickListener {  
  38.     private final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;  
  39.     private final int FP = LinearLayout.LayoutParams.FILL_PARENT;  
  40.     public TextView tv;  
  41.     private myThread t;  
  42.     private Button btn, btn2, btn3;  
  43.    
  44.     public void onCreate(Bundle icicle) {  
  45.                 super.onCreate(icicle);  
  46.                 LinearLayout layout = new LinearLayout(this);  
  47.                 layout.setOrientation(LinearLayout.VERTICAL);  
  48.    
  49.                 btn = new Button(this);  
  50.                 btn.setId(101);  
  51.                 btn.setText("test looper");  
  52.                 btn.setOnClickListener(this);  
  53.                 LinearLayout.LayoutParams param =  
  54.                     new LinearLayout.LayoutParams(100,50);  
  55.                 param.topMargin = 10;  
  56.                 layout.addView(btn, param);   
  57.    
  58.                 btn2 = new Button(this);  
  59.                 btn2.setId(102);  
  60.                 btn2.setText("exit");  
  61.                 btn2.setOnClickListener(this);  
  62.                 layout.addView(btn2, param);  
  63.    
  64.                 tv = new TextView(this);  
  65.                 tv.setTextColor(Color.WHITE);  
  66.                 tv.setText("");  
  67.                 LinearLayout.LayoutParams param2 =  
  68.                    new LinearLayout.LayoutParams(FP, WC);  
  69.                 param2.topMargin = 10;  
  70.                 layout.addView(tv, param2);  
  71.                 setContentView(layout);  
  72.                }  
  73.         public void onClick(View v) {  
  74.         switch(v.getId()){  
  75.         case 101:  
  76.              t = new myThread();  
  77.              t.start();  
  78.              break;  
  79.         case 102:  
  80.             finish();  
  81.             break;  
  82.         }  
  83.     }  
  84. //------------------------------------------------------  
  85. class EHandler extends Handler {  
  86.             public EHandler(Looper looper) {  
  87.                 super(looper);  
  88.             }  
  89.             @Override  
  90.             public void handleMessage(Message msg) {  
  91.                tv.setText((String)msg.obj);  
  92.         }  
  93.     }  
  94. //------------------------------------------------------  
  95. class myThread extends Thread{  
  96.      private EHandler mHandler;  
  97.      public void run() {  
  98.          Looper myLooper, mainLooper;  
  99.          //取出本线程中的Looper,当然如果本句话放在主线程中,则会取得主线程的Looper  
  100.                   myLooper = Looper.myLooper();  
  101.                  //取出主线程中的Looper  
  102.          mainLooper = Looper.getMainLooper();  
  103.          String obj;  
  104.          if(myLooper == null){  
  105.              mHandler = new EHandler(mainLooper);  
  106.              obj = "current thread has no looper,this message is from Main thread!";  
  107.          }  
  108.          else {  
  109.               mHandler = new EHandler(myLooper);  
  110.               obj = "This is from new thread.";  
  111.          }  
  112.          mHandler.removeMessages(0);  
  113.          Message m = mHandler.obtainMessage(1, 1, 1, obj);  
  114.          mHandler.sendMessage(m);  
  115.       }  
  116.   }  
  117. }  
 
 

在本程序中Android仍然会自动替主线程建立Message Queue。在点击按钮之后,新生成的子线程中并不会建立Message Queue。所以,新线程中的myLooper值为null,而mainLooper则指向主线程里的Looper对象。于是,执行当到指令:
mHandler = new EHandler(mainLooper); 时这个mHandler是属于主线程的。
通过指令:mHandler.sendMessage(m); 便将消息m存入到主线程的Message Queue里。mainLooper看到Message Queue里有讯息,就会自动处理,主线程会自动回调mHandler的handleMessage()函数来处理消息。



本文转自 最牛傻蛋 51CTO博客,原文链接:http://blog.51cto.com/zuiniuwang/718340,如需转载请自行联系原作者

相关文章
“framework必会”系列:Android Input系统(一)事件读取机制
曾经在开发的很长一段时间内,笔者对点击事件的认知只存在于自定义View中的`onTouchEvent`等方法的处理。 后来慢慢的接触到`Android的事件分发机制`,但也只是在**Activity->ViewGroup->View**层面的分发逻辑
|
4月前
|
Android开发 容器
[Android]View的事件分发机制(源码解析)
[Android]View的事件分发机制(源码解析)
36 0
|
4月前
|
消息中间件 缓存 安全
android开发,使用kotlin学习消息机制Handler
android开发,使用kotlin学习消息机制Handler
78 0
|
4月前
|
安全 Android开发 Kotlin
android开发,使用kotlin学习Android权限机制
android开发,使用kotlin学习Android权限机制
35 0
|
8月前
|
Android开发
Android 使用Alarm机制创建长时间在后台运行的定时任务
Android 使用Alarm机制创建长时间在后台运行的定时任务
158 0
|
8月前
|
Java API Android开发
Android 权限机制详解
Android 权限机制详解
72 0
|
8月前
|
XML 消息中间件 API
Android 中handler消息机制的理解
Android 中handler消息机制的理解
46 0
|
12月前
|
调度 Android开发
Android异步消息处理机制之Handler、Looper、Message
因为Android UI线程是线程不安全的,在子线程中更新UI会直接程序崩溃,另外当UI线程需要执行一个比较耗时的操作的话(IO操作,网络通信等),若是执行时间超过5s,程序会直接ANR,为了解决上述问题,可以使用异步消息处理机制[Handler]
|
设计模式 前端开发 Java
Android体系课之--Kotlin协程进阶篇-协程的异常处理机制以及suspend关键字(三)
协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程(甚至不同机器!)上调度执行,而代码则保持如同顺序执行一样简单。
|
缓存 Android开发 UED
一文读懂系列Android屏幕刷新机制
对一些大中型项目来说可能就不一样了:**他们涉及业务较多,设备种类较多,往往一个app内部集成了十几个子业务甚至上百个,这对应用性能要求就更加严格了,app的体验也会间接导致用户的留存问题**。 所以学习屏幕绘制这类理论性较强的知识也是非常有必要的。