从“对象”看Handler:管家
在国内外,如果说Android潮势不可阻挡,那么学习了解它便是顺其自然, 个中体会也就不在话下。
做过小程序之后,想干点大点儿的“作品”,满足满足自己的虚荣感与成就感,很荣幸的发现自己仅是井底之蛙一只。要处理一堆繁杂的任务,离开了多线程可是万万不能的。但在一次处理多线程时,又惊异的发现了Handler,它乃是线程中的“消息管家”!
先看看范例
package com.briliasm;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class Blog extends Activity {
private Handler handler=new Handler();
private TextView tv;
private String[] str={"hello","briliasm","android","byebye","haha"};
private int index=0;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
index=str.length;
tv =(TextView) this.findViewById(R.id.tv);
new Thread(new Runnable(){
public void run() {
while(true){
try {
Thread.sleep(500);
changeLength();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
handler=new Handler(){
public void handleMessage(Message msg){
super.handleMessage(msg);
tv.setText(str[index]);
tv.invalidate();
}
};
}
protected void changeLength() {
if(index-1>=0){
index-=1;
}else
index=4;
handler.sendMessage(handler.obtainMessage());
}
}
仔细看看 handler在哪几处存在:
•首先,它作为域存在于Blog这个activity中
private Handler handler=new Handler();
•在onCreate函数中被重新赋值,并实现其处理函数
handler=new Handler(){
public void handleMessage(Message msg){
super.handleMessage(msg);
tv.setText(tv.getText().subString(0,length));
tv.invalidate();
}
};
•在新建的线程中发送消息
handler.sendMessage(handler.obtainMessage());
•作为发送消息的参数
handler.sendMessage(handler.obtainMessage());
很容易handler在此过程中,在管理着一切的消息——由他发送,由他接收,由他处理。倘若不叫他管家,如何又说的过去呢。的确,我暗服android设计师的构思(这只是其强大之一瞥,例如其他在MVC上的封装等),然而从面向对象的角度理解,似乎一切都那么的顺理成章,正如上面所说的,Handler对象就是我们所听过了的对象——管家。
细细说来,handler与线程是分不开的,即handler必附着于一个线程,它正是此线程的管家,它负责处理该线程内所有的消息。