在Android的开发中有时需要动态的修改组件的属性值,但是Android平台不允许Activity启动一个线程来访问Activity里面的界面组件,这时需要通过handler的消息传递机制来实现了
Handler类主要作用有两个:1.在新启动的线程中发送消息。
2.在主线程接受消息。
Handler包含如下方法来发送和接受消息:
- void handlerMessage(Message msg)
- final boolean hasMessage(int What)
- final boolean hasMessage(int what,Object object);
- sendEmptyMessage(int what)
- final boolean sendMessageDelayed(int What , long delayMilis)
- f inal boolean sendMessage(Message msg)
- final boolean sendMessageDelayed(Message msg,long delay)
为了让主线程能够及时的接受消息我们需要在主线程里面重写Handler类的handleMessage(Message msg)方法。
下面就用一个小例子来简要的说明一下Handler的消息传递机制吧!
这个例子是通过Timer周期性的想消息队列发送消息,主线程在接到消息后修改ImageView 的属性,本例子要达到的效果是实现4张图片交替显示的动态效果。
package org.login;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
public class HandlerTest extends Activity {
private ImageView img;
int[] imgeIds = new int[]{
R.drawable.hero_soldier_1,
R.drawable.hero_soldier_2,
R.drawable.hero_soldier_3,
R.drawable.hero_soldier_4};
int id=0;
int temp=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.handler);
img = (ImageView) findViewById(R.id.img_ha);
final Handler mhandler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==0x007)
{
img.setImageResource(imgeIds[id]);
id++;
if(id>=4)
{
id=0;
}
}
}
};
new Timer().scheduleAtFixedRate(new TimerTask(){
@Override
public void run() {
Message msg = new Message();
msg.what=0x007;
mhandler.sendMessage(msg);
}
}, 0, 100);
}
}