1. 程式人生 > >安卓Handler訊息機制

安卓Handler訊息機制

安卓Handler主要有兩個作用

1.在新啟動的執行緒中傳送訊息

2.在中執行緒中獲取處理訊息

在Android平臺中,新啟動的執行緒是無法訪問Activity裡的Widget的,當然也不能將執行狀態外送出來,這就需要有Handler機制進行訊息的傳遞了,Handler類位於android.os包下,主要的功能是完成Activity的Widget與應用程式中執行緒之間的互動。接下來對該類中常用的方法進行介紹,如表7-1所示。

表7-1  Handler類的常用方法

方法簽名

描    述

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類的程式步驟如下。

在Activity或Activity的Widget中開發Handler類的物件,並重寫handleMessage方法。

在新啟動的執行緒中呼叫sendEmptyMessage或者sendMessage方法向Handler傳送訊息。

Handler類的物件用handleMessage方法接收訊息,然後根據訊息的不同執行不同的操作。

下面看一個週期性的改變顯示圖片的例子

main.xml裡面的內容

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >


    <ImageView
        android:id="@+id/show"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/ic_launcher" />


</RelativeLayout>

Activity裡面的內容

package com.example.handletest;


import java.util.Timer;
import java.util.TimerTask;


import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.widget.ImageView;


public class MainActivity extends Activity {


//定義週期性顯示的圖片的ID
int[] imageIds = new int[]

R.drawable.image1,
R.drawable.image2,
R.drawable.image3,
R.drawable.image4,
R.drawable.image5
};
int currentImageId = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView show = (ImageView)findViewById(R.id.show);
final Handler myHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
//如果該訊息是本程式所傳送的
if (msg.what == 0x1222)
{
//動態地修改所顯示的圖片
show.setImageResource(imageIds[currentImageId++]);
if (currentImageId >= 4)
{
currentImageId = 0; 
}
}
}
};
//定義一個計時器,讓該計時器週期性地執行指定任務
new Timer().schedule(new TimerTask()
{
@Override
public void run()
{
//新啟動的執行緒無法訪問該Activity裡的元件
//所以需要通過Handler傳送資訊
Message msg = new Message();
msg.what = 0x1222;
//傳送訊息
myHandler.sendMessage(msg);
}
}, 0 , 2*1000);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


}

原始碼在我的資源裡