handler的作用,将一些非主UI线程更新UI,传递一些数据等等。
Handler中分发消息和runnable的一些方法:
post(Runnable),
postAtTime(Runnable, long),
postDelayed(Runnable, long),
sendEmptyMessage(int),
sendMessage(Message),
sendMessageAtTime(Message, long),sendMessageDelayed(Message, long)
Handler删除消息和runnable的方法:
removeCallbacks(Runnable),
removeCallbacks(Runnable, Object ),
removeCallbacksAndMessages(Object),
removeMessages(int),
removeMessages(int , Object )
作用:调度消息,将一个任务切换到某个指定的线程中去执行。
new Thread(new Runnable() {
@Override
public void run() {
/**
耗时操作
*/
handler.post(new Runnable() {
@Override
public void run() {
/**
更新UI
*/
}
});
}
}).start();
或者
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) { //判断标志位
case 1:
/**
获取数据,更新UI
*/
break;
}
}
};
public class WorkThread extends Thread {
@Override
public void run() {
super.run();
/**
耗时操作
*/
//从全局池中返回一个message实例,避免多次创建message(如new Message)
Message msg =Message.obtain();
msg.obj = data;
msg.what=1; //标志消息的标志
handler.sendMessage(msg);
}
}
new WorkThread().start();
Demo:
(1)定义一个handler变量
private final Handler mHandler = new Handler();
(2)定义一个Runnable变量
private Runnable onDoSomethingRunnable = new Runnable() {
public void run() {
onDoSomething();
}
};
(3)定义onDoSomething()方法:
public void onDoSomething(){
..................................
..................................
mHandler.postDelayed(onDoSomethingRunnable,150);
}
这个组合,可以 实现每隔一段时间,循环的执行某个操作。eg:每隔一秒,更新UI,每隔一段时间,去查看一个进程或者服务是否结束,有点消耗资源,因为他会循环的执行固定的操作,所以一般还是少用。
1. 在一段数据处理的耗时操作后,如果这个操作超过1s,就显示进度条,如果耗时操作不超过1s,则不显示进度条后
//Handler处理消息
final Handler handler = new Handler();
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage(getText(R.string.adding_recipients));
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(false);
final Runnable showProgress = new Runnable() {
public void run() {
progressDialog.show();
}
};
// Only show the progress dialog if we can not finish off parsing the return data in 1s,
// otherwise the dialog could flicker.
handler.postDelayed(showProgress, 1000);
new Thread(new Runnable() {
public void run() {
try {
//数据处理
} finally {
handler.removeCallbacks(showProgress);
progressDialog.dismiss();
}
}
}).start();
2. 更新UI界面
在需要更新页面的地方,发出更新界面的命令
private static final int UPDATE_PAGE_INDICATOR = 1;
/****更新用户选中的数目******/
private static final int UPDATE_SELE_COUNT = 2;
/****更新页面指示器******/
Message msg = myHandler.obtainMessage();
Bundle bundle = new Bundle();
//bundle.putInt("page", page);
bundle.putInt("page", PageCurrent);
msg.setData(bundle); // 向消息中添加数据
msg.what = UPDATE_PAGE_INDICATOR;
myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
在需要更新指示选中数目的TextView的地方,发出更新界面的命令
myHandler.sendEmptyMessage(UPDATE_SELE_COUNT);
更新界面的操作,都放在myHandler 中
/***********myHandler:更新界面***********/
public Handler myHandler = new Handler(){
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what)
{
case UPDATE_PAGE_INDICATOR :
Bundle data = msg.getData();
int page = (Integer) data.get("page");
/*****更新页面指示器******/
upDatePageIndicator(page);
break;
case UPDATE_SELE_COUNT:
mySelectCount.setText(""+selectCount);
break;
}
}
};
3.Handler 和 Runnable 控制显示一个文本,1.5s后,让其不显示:
private TextView overlay = null;
LayoutInflater inflater = LayoutInflater.from(this);
overlay = (TextView) inflater.inflate(R.layout.overlay, null);
private Handler <strong>handler</strong>;
handler = new Handler();
private OverlayThread <strong>overlayThread</strong>;
overlayThread = new OverlayThread();
overlay.setText(sections[position]);
overlay.setVisibility(View.VISIBLE);
<strong>handler.removeCallbacks(overlayThread);
/*****延迟一秒后执行,让overlay为不可见*****/
handler.postDelayed(overlayThread, 1500);</strong>
/**
* 类描述:OverlayThread:实现设置overlay不可见
* @author hexiaoming
* @version
*/
private class OverlayThread implements Runnable {
/**
* 方法描述:run方法
* @param
* @return
* @see OverlayThread
*/
public void run() {
overlay.setVisibility(View.GONE);
}
}