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