今天介绍一下Android的消息传递机制Handler,Handler是另一种形式的“事件处理”,这种机制主要是为了解决Android应用的多线程问题---Android平台不允许Activity新启动的线程访问该Activity里的界面组件,这样就会导致新启动的线程无法动态改变界面组件的属性值。
Handler类主要有两个作用:
在新启动的线程中发送消息;
在主线程中获取、处理消息。
Handler类包含如下方法用于发送、处理消息:
voidhandlerMessage(Message msg):处理消息的方法,该方法通常用于被重写。
finalboolean hasMessage(int what):检查消息队列中是否包含what属性为指定值的消息。
finalboolean hasMessage(int what,Objectobject):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息。
多个重载的Message obtainMessage():获取消息。
sendEmptyMessage(int what):发送空消息。
finalboolean sendEmptyMessageDelayed(int what,longdelayMillis):指定多少毫秒之后发送空消息。
finalboolean sendMessage(Message msg):立即发送消息。
finalboolean sendMessageDelayed(Message msg,longdelayMillis):指定多少毫秒之后发送消息。
下面看个实例,该实例通过一个新线程来周期性地修改ImageView所显示的图片,直接上代码:
public class HandlerTest extends Activity
{
//定义周期性显示的图片的ID
int[] imageIds = new int[]
{
R.drawable.java,
R.drawable.ee,
R.drawable.ajax,
R.drawable.xml,
R.drawable.classic
};
int currentImageId = 0;
@Override
public void onCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView show =(ImageView)findViewById(R.id.show);
final Handler myHandler = newHandler()
{
@Override
public voidhandleMessage(Message msg)
{
//如果该消息是本程序所发送的
if(msg.what == 0x1233)
{
//动态地修改所显示的图片
show.setImageResource(imageIds[currentImageId++]);
if(currentImageId >= 4)
{
currentImageId= 0;
}
}
}
};
//定义一个计时器,让该计时器周期性地执行指定任务
new Timer().schedule(newTimerTask()
{
@Override
public voidrun()
{
//新启动的线程无法访问该Activity里的组件
//所以需要通过Handler发送信息
Messagemsg = new Message();
msg.what= 0x1233;
//发送消息
myHandler.sendMessage(msg);
}
}, 0 , 800);
}
}