1. 程式人生 > >Android筆記二十五.Android事件Handler消息傳遞機制

Android筆記二十五.Android事件Handler消息傳遞機制

text table @override () lin dom align ttext 子線程

因為Android平臺不同意Activity新啟動的線程訪問該Activity裏的界面控件。這樣就會導致新啟動的線程無法動態改變界面控件的屬性值。但在實際Android應用開發中,尤其是涉及動畫的遊戲開發中,須要讓新啟動的線程周期性地改變界面控件的屬性值,這就須要借助Handler的消息傳遞機制實現 一、Handler類簡單介紹 1.功能 Handler類主要有兩個作用 (1)在新啟動的線程中發送消息; (2)在主線程中獲取消息、處理消息。即當須要界面發生變化的時候。在子線程中調用Handler類的sendEmptyMessage()方法或sendMessage方法來發送消息到Handler。為了讓主線程能"適時"地處理新啟動的線程所發送的消息,可採用回調的方式
來實現
--僅僅需重寫Handler類中處理消息的方法,當新啟動的線程發送消息時。Handler類中處理消息的方法會被自己主動調用。

2.Hnadler類經常用法

方法

描 述

public void handleMessage (Message msg)

通過該方法獲取、處理消息

public final boolean sendEmptyMessage (int what)

發送一個僅僅含有what標記的空消息

public final boolean sendMessage (Message msg)

發送消息到

Handler,通過handleMessage()方法接收和處理

public final boolean hasMessages (int what)

監測消息隊列是否包括標記為what的消息

public final boolean post (Runnable r)

將一個線程對象加入到消息隊列

二、Handler消息傳遞程序開發步驟 (1)創建一個Handler類對象,並重寫handleMessage()方法(用於獲取、處理消息); (2)在新啟動的線程中,調用Handler對象的發送消息方法; (3)利用Handler對象的handleMessage()方法接收消息。然後依據不同的消息運行不同的操作。

註意:發送和處理消息的是同一Handler對象。即自己發送,自己處理。 三、源代碼實戰 實現:實現一個動態變化的隨機數效果。 (1)HandlerTest.java
package com.example.android_handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class HandlerTest extends Activity {
 int i=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final TextView text = (TextView)findViewById(R.id.random);
        //1.創建一個Handler類對象,並重寫handleMessage()方法
        final Handler handler = new Handler(){
   @Override
   public void handleMessage(Message msg)
   {
    if(msg.what==0x520)
    {
     text.setText("獲得的新隨機數為:\n"+Math.random());
    }
   }
        };
     
        //2.定義一個計時器。讓該計時器以1.2s周期性地運行指定任務(毫秒為基本單位)
//       new Timer().schedule(new TimerTask(){
//	 public void run() {
//	 handler.sendEmptyMessage(0x520);
//	 }
//        }, 0, 1200);
        new Thread(new Runnable(){
   public void run() {
    while(true)
    {
     try {
      Thread.sleep(1200);
     } catch (Exception e) {
      e.printStackTrace();
     }
     handler.sendEmptyMessage(0x520);
    }
   }
        }).start();
    }
}


(2)layout/main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
        android:id="@+id/random"
        android:textSize="20sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="35dp"
        android:layout_gravity="center"/>
</LinearLayout>
效果演示 技術分享
技術分享 源代碼分析:通過以上實例。我們知道在子線程發送消息時能夠採用兩種方法 a.定時器 new Timer().schedule(new TimerTask() { public void run() { ......功能代碼..... } } b.子線程延時 new Thread(new Runnable() { public void run() { while(true) { Thread.sleep(1200); ......功能代碼..... } } }).start(); 該方法有兩點須要註意,一是假設希望程序不停的發送消息,則須要通過while(true)將功能代碼包含起來。二是當子線程創建成功後,須要調用Thread的start()方法來啟動該子線程。

Android筆記二十五.Android事件Handler消息傳遞機制