一、Handler的基本概念
Handler主要用于是对异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另一部分逐一在消息队列中将消息取出。发送消息和接受消息是异步的处理。通常情况下,都是线程,将消息取出就是执行线程的run方法。
二、Handler的基本使用方法
<Button
android:id="@+id/startButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="start" />
<Button
android:id="@+id/endButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="end" />
public class HandlerTest extends Activity {
private Button startButton = null;
private Button endButton = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new StartButtonListener());
endButton = (Button) findViewById(R.id.endButton);
endButton.setOnClickListener(new EndButtonListener());
}
class StartButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
//将要执行的线程对象放入队列中
handler.post(updateThread);
}
}
class EndButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
//删除当前队列中未执行的线程对象
handler.removeCallbacks(updateThread);
}
}
//创建Handler对象
Handler handler = new Handler();
//新建一个线程对象
Runnable updateThread = new Runnable() {
@Override
//将要执行的操作写入线程对象的run方法中
public void run() {
System.out.println("UpdateThread");
//此方法的作用是:将要执行的线程对象放入到队列中,待时间结束后,运行制定的线程对象
//第一个参数是Runnable对象,表示将要执行的线程对象
//第二个参数是long类型,表示延迟的时间,以毫秒为单位
handler.postDelayed(updateThread, 3000);
}
};
}
三、使用Handler更新ProgressBar
<ProgressBar
android:id="@+id/handlerpro_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:visibility="gone" />
<Button
android:id="@+id/handlepro_startButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始" />
public class ProgressBarHandler extends Activity {
private ProgressBar bar = null;
private Button myStartButton = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bar = (ProgressBar) findViewById(R.id.handlerpro_bar);
myStartButton = (Button) findViewById(R.id.handlepro_startButton);
myStartButton.setOnClickListener(new ButtonListener());
}
class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
bar.setVisibility(View.VISIBLE);
updateBarHandler.post(updateThread);
}
}
Handler updateBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
bar.setProgress(msg.arg1);
updateBarHandler.post(updateThread);
};
};
//线程类,该类使用匿名内部类的方式进行声明
Runnable updateThread = new Runnable() {
int i = 0;
@Override
public void run() {
System.out.println("Begin Thread");
i = i + 10;
//得到一个消息对象,Message是由Android OS 提供
Message msg = updateBarHandler.obtainMessage();
//将msg的arg1参数设为i,用arg1和arg2这两个成员变量传递消息
msg.arg1 = i;
try {
//设置当前显示睡眠1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//将msg对象加入到消息队列中
updateBarHandler.sendMessage(msg);
if(i == 100){
//如果当i值为100时,就将线程对象从Handler中移除
updateBarHandler.removeCallbacks(updateThread);
}
}
};
}