安卓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;
}
}