Android 的消息机制(3)

本文介绍如何在Android中通过隐式方式指定Looper来创建Handler对象,从而实现与主线程MessageQueue的交互。通过实例代码展示了创建EventHandler对象的过程及其如何用于更新UI。

当然我们也可以隐式的指定Looper ,代码如下:

?[Copy to clipboard] Download zuiniuwang.java
 
 
  
  1. /**  
  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.messagequeue;  
  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 MessageQueue3 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.     private EHandler mHandler;  
  44.    
  45.     public void onCreate(Bundle icicle) {  
  46.                 super.onCreate(icicle);  
  47.                 LinearLayout layout = new LinearLayout(this);  
  48.                 layout.setOrientation(LinearLayout.VERTICAL);  
  49.    
  50.                 btn = new Button(this);  
  51.                 btn.setId(101);  
  52.                 btn.setText("test looper");  
  53.                 btn.setOnClickListener(this);  
  54.                 LinearLayout.LayoutParams param =  
  55.                     new LinearLayout.LayoutParams(100,50);  
  56.                 param.topMargin = 10;  
  57.                 layout.addView(btn, param);   
  58.    
  59.                 btn2 = new Button(this);  
  60.                 btn2.setId(102);  
  61.                 btn2.setText("exit");  
  62.                 btn2.setOnClickListener(this);  
  63.                 layout.addView(btn2, param);  
  64.    
  65.                 tv = new TextView(this);  
  66.                 tv.setTextColor(Color.WHITE);  
  67.                 tv.setText("");  
  68.                 LinearLayout.LayoutParams param2 =  
  69.                    new LinearLayout.LayoutParams(FP, WC);  
  70.                 param2.topMargin = 10;  
  71.                 layout.addView(tv, param2);  
  72.                 setContentView(layout);  
  73.                }  
  74.         public void onClick(View v) {  
  75.         switch(v.getId()){  
  76.         case 101:  
  77. //           mHandler = new EHandler(Looper.myLooper());  
  78.              //可以隐式的制定Looper,和上面的效果是一样的  
  79.              mHandler = new EHandler();  
  80.              t = new myThread();  
  81.              t.start();  
  82.              break;  
  83.         case 102:  
  84.             finish();  
  85.             break;  
  86.         }  
  87.     }  
  88. //------------------------------------------------------  
  89. class EHandler extends Handler {  
  90.             public EHandler(Looper looper) {  
  91.                 super(looper);  
  92.             }  
  93.             public EHandler(){  
  94.    
  95.             }  
  96.             @Override  
  97.             public void handleMessage(Message msg) {  
  98.                tv.setText((String)msg.obj);  
  99.         }  
  100.     }  
  101. //------------------------------------------------------  
  102. class myThread extends Thread{  
  103.    
  104.      public void run() {  
  105.    
  106.          String obj = "This message is from new thread.";  
  107.          mHandler.removeMessages(0);  
  108.          Message m = mHandler.obtainMessage(1, 1, 1, obj);  
  109.          mHandler.sendMessage(m);  
  110.       }  
  111.   }  
 
 

在此代码中,指令:h = new EventHandler();就等于:h = new EventHandler(Looper.myLooper());
它建立了当前线程(Current Thread)的EventHandler对象。由于是由main线程执行此指令的,所以此EventHandler对象是用来存取main线程的Message Queue的。


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值