Android筆記二十五.Android事件Handler消息傳遞機制
阿新 • • 發佈:2017-06-13
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類經常用法
二、Handler消息傳遞程序開發步驟
(1)創建一個Handler類對象,並重寫handleMessage()方法(用於獲取、處理消息);
(2)在新啟動的線程中,調用Handler對象的發送消息方法;
(3)利用Handler對象的handleMessage()方法接收消息。然後依據不同的消息運行不同的操作。
註意:發送和處理消息的是同一Handler對象。即自己發送,自己處理。
三、源代碼實戰
實現:實現一個動態變化的隨機數效果。
(1)HandlerTest.java
(2)layout/main.xml
源代碼分析:通過以上實例。我們知道在子線程發送消息時能夠採用兩種方法 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()方法來啟動該子線程。
方法 |
描 述 |
public void handleMessage (Message msg) |
通過該方法獲取、處理消息 |
public final boolean sendEmptyMessage (int what) |
發送一個僅僅含有what標記的空消息 |
public final boolean sendMessage (Message msg) |
發送消息到 |
public final boolean hasMessages (int what) |
監測消息隊列中是否包括標記為what的消息 |
public final boolean post (Runnable r) |
將一個線程對象加入到消息隊列 |
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消息傳遞機制