Handler消息传递机制在android中至关重要,Android应用开发中,我们需要用线程周期性的改变控件的属性值,而此则需要Handler的消息机制去实现。
Handler类的主要作用与用法:
在新启动的线程中发送消息;在主线程获取,处理消息。
利用一个实例来介绍Handler的使用方法----Handler控制进度条。
资源文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- 一个进度条控件 -->
<ProgressBar
android:id="@+id/bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:visibility="gone"
/>
<!-- 一个Button按钮控件 -->
<Button
android:id="@+id/startBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="start"/>
</LinearLayout>
Activity代码:
package cn.android.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
public class HandlerProgressBarActivity extends Activity implements OnClickListener{
//声明两个控件
ProgressBar bar = null;
Button startButton = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
}
//通过控件ID得到控件
private void findViews() {
bar = (ProgressBar) this.findViewById(R.id.bar);
startButton = (Button) this.findViewById(R.id.startBtn);
//为控件添加监听器;
bar.setOnClickListener(this);
startButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.startBtn:
//设置进度条显示方式为可见
bar.setVisibility(View.VISIBLE);
//将线程添加到Handler消息队列
updateBarHandler.post(updateThread);
break;
}
}
//使用匿名内部类
Handler updateBarHandler = new Handler(){
public void handleMessage(Message msg){
bar.setProgress(msg.arg1);
Log.i("SWORD", "startHandler");
updateBarHandler.post(updateThread);
}
};
//使用匿名内部类声明线程类
Runnable updateThread = new Runnable(){
int i = 0;
public void run(){
Log.i("SWORD", "Begin Thread");
i+=10;
//得到一个消息对象
Message msg = updateBarHandler.obtainMessage();
//将msg对象的arg1参数的值设置为i;
msg.arg1 = i;
try {
//设置当前线程休眠1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//将msg对象加入到消息队列当中(尾部)
updateBarHandler.sendMessage(msg);
if(i==100){
//如果当i的值为100时将当前线程从handler中移除
updateBarHandler.removeCallbacks(updateThread);
}
}
};
}
在虚拟机上的运行效果: