Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行处理,就是发送消息和接收消息不是同步的处理。这种机制通常用来处理相对耗时比较长的操作。
下面是一个简单的例子:
一个应用程序中有一个进度条和一个按钮,当点击按钮后,每隔一秒钟进度条前进一部分 ,并打印log日志记录相关信息。
1. MainActivity.java
package com.example.test_s_c;
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 MainActivity extends Activity {
/** Called when the activity is first created. */
private ProgressBar progressBar;
private Button startButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = (ProgressBar)findViewById(R.id.progressbar);
startButton = (Button)findViewById(R.id.startButton);
startButton.setOnClickListener(new ProgressBarOnClickListener());
}
class ProgressBarOnClickListener implements OnClickListener{
public void onClick(View v) {
//设置进度条为可见状态
progressBar.setVisibility(View.VISIBLE);
updateBarHandler.post(updateThread);//将要执行的线程放入到待执行的消息队列当中
}
}
//使用匿名内部类来复写Handler当中的handlerMessage()方法
Handler updateBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
progressBar.setProgress(msg.arg1);
if(msg.arg1==100){
updateBarHandler.removeCallbacks(updateThread); //将线程对象从队列中移除
}else{
updateBarHandler.post(updateThread); //将要执行的线程放入到队列当中
}
}
};
//线程类,该类使用匿名内部类的方式进行声明
Runnable updateThread = new Runnable(){
int i = 0;
public void run() {
// TODO Auto-generated method stub
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对象加入到消息队列当中
Log.i("HandlerTest", "Begin Thread,i="+i);
updateBarHandler.sendMessage(msg);
}
};
}
2.activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<ProgressBar
android:id="@+id/progressbar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="200dip"
android:layout_height="40dip"
android:minHeight="40dip"
android:layout_gravity="center_horizontal"
/>
<Button
android:id="@+id/startButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="开始" />
</LinearLayout>
3.运行效果图
4.日志信息