一、 Handler的基本概念
Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理。(通常情况下,都是线程。将消息取出就是执行线程的run方法)
这种机制通常用来处理相对耗时比较长的操作。如下载文件等。
一个Handler对象对应一个消息队列。
二、 使用一个例子简单的来介绍一下Handler
示例1:一个应用程序中有2个按钮(start、end),当点击start按钮时,执行一个线程,这个线程在控制台输出一串字符串,并且每隔3秒再执行一次线程,直到点击end按钮为止,线程停止。
下图为这个应用程序的界面:
Main.xml中
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始"/>
<Button
android:id="@+id/end"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="结束"/>
在java文件中
publicclassHandlerTestextendsActivity {
privateButtonstartButton;
privateButtonendButton;
@Override
publicvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//根据id获得控件对象
startButton=(Button)findViewById(R.id.start);
endButton=(Button)findViewById(R.id.end);
//为控件设置监听器
startButton.setOnClickListener(newStartButtonListener());
endButton.setOnClickListener(newEndButtonListener());
}
classStartButtonListenerimplementsOnClickListener{
publicvoidonClick(View v) {
//调用Handler的post()方法,将要执行的线程对象放到队列当中
handler.post(updateThread);
}
}
classEndButtonListenerimplementsOnClickListener{
publicvoidonClick(View v) {
//调用Handler的removeCallbacks()方法,删除队列当中未执行的线程对象
handler.removeCallbacks(updateThread);
}
}
//创建Handler对象
Handlerhandler= newHandler();
//新建一个线程对象
RunnableupdateThread= newRunnable(){
//将要执行的操作写在线程对象的run方法当中
publicvoidrun(){
System.out.println("updateThread");
//调用Handler的postDelayed()方法
//这个方法的作用是:将要执行的线程对象放入到队列当中,待时间结束后,运行制定的线程对象
//第一个参数是Runnable类型:将要执行的线程对象
//第二个参数是long类型:延迟的时间,以毫秒为单位
handler.postDelayed(updateThread, 3000);
}
};
}
我的理解总结一下:
1) 首先,创建一个Handler对象
2) 在某一个监听事件中,利用post方法将线程加入消息队列
3) 将要执行的操作,写在线程对象的run方法中
三、 示例2:一个应用程序中有一个进度条和一个按钮,当点击按钮后,每隔一秒钟进度条前进一部分。
下图为应用程序的运行效果图:
(注:这里用到了两个队列。)
publicclassProgressBarHandlerTestextendsActivity {
privateProgressBarprogressBar;
privateButtonstartButton;
@Override
publicvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
progressBar=(ProgressBar)findViewById(R.id.progressbar);
startButton=(Button)findViewById(R.id.startButton);
startButton.setOnClickListener(newProgressBarOnClickListener());
}
classProgressBarOnClickListenerimplementsOnClickListener{
publicvoidonClick(View v) {
//设置进度条为可见状态
progressBar.setVisibility(View.VISIBLE);
updateBarHandler.post(updateThread);
}
}
//使用匿名内部类来复写Handler当中的handlerMessage()方法
HandlerupdateBarHandler= newHandler(){
@Override
publicvoidhandleMessage(Message msg){
progressBar.setProgress(msg.arg1);
updateBarHandler.post(updateThread); //将要执行的线程放入到队列当中
}
};
//线程类,该类使用匿名内部类的方式进行声明
RunnableupdateThread= newRunnable(){
inti= 0;
publicvoidrun() {
//TODOAuto-generated method stub
System.out.println("Begin Thread");
i+=10;
//得到一个消息对象,Message类是android系统提供的
Message msg =updateBarHandler.obtainMessage();
//将Message对象的arg1参数的值设置为i
msg.arg1=i;//用arg1、arg2这两个成员变量传递消息,优点是系统性能消耗较少
try{
Thread.sleep(1000); //让当前线程休眠1000毫秒
}catch(InterruptedException ex){
ex.printStackTrace();
}
//将Message对象加入到消息队列当中
updateBarHandler.sendMessage(msg);
//如果i的值等于100
if(i== 100){
//将线程对象从队列中移除
updateBarHandler.removeCallbacks(updateThread);
}
}
};
}