1.
Handler用于send和processMessage和Runnable对象。
2. Handler实例属于于创建它的Thread,处理该Thread消息队列中的消息。
主要应用:
1. 调度Messages/Runnables在将来的某一个时间点执行
2. 向其它Thread发送action,其它Thread注册这个action接收和处理,就可以响应该action
方法:
post(Runnable)
postAtTime(Runnable, long) //在指定时间post
postDelayed(Runnable, long) //延迟post
当Runnable object被接收时(什么时候被接收,被谁接收?),会调用Runnable Object的run()方法。
sendEmptyMessage(int)
sendMessage(Message);
sendMessageAtTime(Message, long);
sendMessageDelayed(Message, long);
Message消息将会被该Handler的 handlerMessage(Message)方法处理。Message中可以包含Bundle数据。
思考点:
1. Android中除了UI线程,其它工作线程默认情况下是没有消息循环和消息队列的(学习如何为Thread创建消息循环和消息队列)
2. 每个Handler都对应于某个Thread,并将消息发送到该Thread的消息队列
例子:
在Handler的应用中有一个很经典的例子,就是处理比较耗时的操作,将操作结果反映到UI上。由于UI线程不能执行耗时操作,而UI的更新又必须在UI线程进行(为什么必须在UI线程进行,涉及到线程安全问题),此时Handler可以很好的解决该问题。
2. Handler实例属于于创建它的Thread,处理该Thread消息队列中的消息。
主要应用:
1. 调度Messages/Runnables在将来的某一个时间点执行
2. 向其它Thread发送action,其它Thread注册这个action接收和处理,就可以响应该action
方法:
post(Runnable)
postAtTime(Runnable, long) //在指定时间post
postDelayed(Runnable, long) //延迟post
当Runnable object被接收时(什么时候被接收,被谁接收?),会调用Runnable Object的run()方法。
sendEmptyMessage(int)
sendMessage(Message);
sendMessageAtTime(Message, long);
sendMessageDelayed(Message, long);
Message消息将会被该Handler的 handlerMessage(Message)方法处理。Message中可以包含Bundle数据。
思考点:
1. Android中除了UI线程,其它工作线程默认情况下是没有消息循环和消息队列的(学习如何为Thread创建消息循环和消息队列)
2. 每个Handler都对应于某个Thread,并将消息发送到该Thread的消息队列
例子:
在Handler的应用中有一个很经典的例子,就是处理比较耗时的操作,将操作结果反映到UI上。由于UI线程不能执行耗时操作,而UI的更新又必须在UI线程进行(为什么必须在UI线程进行,涉及到线程安全问题),此时Handler可以很好的解决该问题。
实例代码:
public class MainActivity extends ActionBarActivity implements View.OnClickListener{
private static final int COMPLETED = 0;
TextView testview;
Button home;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
testview = (TextView) findViewById(R.id.curPath);
home = (Button) findViewById(R.id.home);
home.setOnClickListener(this);
}
//主线程Handler
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg){
if(msg.what == COMPLETED){
testview.setText("Completed");
}
}
};
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.home:
new WorkThread().start(); //启动一个工作线程,处理耗时的操作
break;
}
}
private class WorkThread extends Thread {
@Override
public void run(){
//…处理耗时操作
//处理完成后,发送消息
Message msg = new Message();
msg.what = COMPLETED;
handler.sendMessage(msg);
//一定不要直接在非UI线程中更新UI
}
}
}