使用消息机制修改界面的信息:
一、要修改view对象中显示的内容:
只有创建view对象的线程 才可以更新view对象里面的内容。
其实所有的view对象都是在主线程里面创建的 名字 main
所有的与ui相关的界面都是在主线程里面创建的.
二、业务需求:子线程每隔2秒要去修改view对象显示的内容:(要通过消息机制完成该操作):
三、更新view显示基本原理:
当子线程要更新view里的内容时,就让子线程发送一个消息给主线程,主线程再根据消息的内容进行操作。
主线程里面有消息队列(message queue),可以存放一组消息。并且还有一个轮询器,定期的轮询消息队列,查看是否有消息。如果发现有消息,;轮询器会把消息取出来。
在主线程中创建消息的处理者handler对象,用于处理在消息队列中取出的消息。
四、代码实现:
public class TestActivity extends Activity{
privateTextView tv;
//在主线程中创建handler对象(消息处理者)
private Handler handler = new Handler(){
//子线程发送消息触发的函数:
public voidhandleMessage(Message msg) {
super.handleMessage(msg);
String text = (String) msg.obj; //获取消息的内容
tv.setText(text); //将内容设置给view对象。
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView) this.findViewById(R.id.tv);
System.out.println(Thread.currentThread().getName());
// tv.setText("haha");
//开启一个子线程 每个2秒 就把textview 里面的内容更改一下
new Thread(){
public void run() {
System.out.println("子线程 "+Thread.currentThread().getName());
for(int i=0;i<100;i++) {
try{
sleep(2000);
}catch (InterruptedException e) {
e.printStackTrace();
}
Messagemsg = new Message();//创建message对象。
msg.obj= "haha"+i; //为消息设置值
handler.sendMessage(msg);//使用handler在子线程中发送消息。
}
};
}.start();
}
}