Handler 主要接受子线程发送的数据, 并用此数据配合主线程更新UI.
每一个Handler对象都维护着一个Handler队列,我们使用Handler对象的post方法把线程加入到我们的Handler队列中。加入到Handler队列中的线程对象会自动的执行。
我们还可以在线程中使用Handler对象的sendMessage方法发送Message对象,发送后,Handler对象的handleMessage方法会接收Message对象并处理。
下面就是一个使用Handler来改变控件按钮的例子;
public class Test extends Activity{
private Button button;
private Handler handler;
Runnable runnable=new Runnable(){//线程,用来加入到Handler队列来执行
@Override
public void run() {
Message msg=new Message();
Bundle bundle=new Bundle();
bundle.putString("txt", "确定");
msg.setData(bundle);
handler.sendMessage(msg);//在Handler队列中执行线程的run方法的时候,发送Message对象。这个Message对象会触发handleMessage方法、
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
button=(Button)findViewById(R.id.button);
handler=new Handler(){//生成一个Handler队列,并覆写接收Message对象的方法。
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle=msg.getData();//接收Message
String s=bundle.getString("txt");
button.setText(s);//用接收到的Message完成Button的修改
}
};
button.setOnClickListener(new OnClickListener(){
public void onClick(View v){
handler.post(runnable);//把线程加入到Handler队列中
}
});
}
}
总结一下这个过程:
(1)创建Handler的子类,并且在Handler子类中覆写handMessage方法用来接收并处理Message对象。
(2)创建Runnable对象的线程,这个线程可以完成我们所需要的异步操作,并使用sendMessage方法来反馈给Handler对象一个Message对象--会触发handMessage方法。
(3)把Runnable对象使用Handler的post方法加入到Handler队列中。加入后,Runnable对象会按照加入的先后顺序执行其run方法。