@author by Hs_ww_bin
出于性能优化的考虑,android的UI操作不是线程安全的,也就是说,android不支持子线程改变UI,因为如果多线程并发改变UI的话,会出现线程安全问题,相信学习过多线程并发的朋友们会很容易理解这一点。所以在android里面,只能通过主线程,或者说UI线程来修改Activity里面的UI组件。
这里又导致了另外一个问题,就是android分配给线程的时间是有限的,假如我们在UI线程里面有大量的操作,导致阻塞了,android就会出现"maybe too much work to do in main thread"的错误,但是这些操作不进行又不行。这个时候就可以用到Handler消息传递机制了。
一般如果有很多操作,比如算法,网络等等的,我们是不会再主线程里面进行的,一般是在新开的线程里面进行的。在新的线程里面执行完操作之后,假如这个操作时和UI有关的,我们不能马上就在新线程里面修改,要通过handler发送消息,然后在主线程里面接收消息,通过主线程修改UI界面。
handler的用法:
handler类包含如下方法:
void handlerMessage(Message msg):处理消息的方法,通常用来被重写。
final boolean sendMessage(Message msg)立即发送消息
final boolean sendMessageDelayed(Message msg,long delayMillis):指定多少毫秒之后发送
Message obtainMessage();获取消息
final boolean hasMessage(int what):检查消息队列中是否包含what属性为指定值的消息
下面举个使用handler的例子:
新的线程:
new Thread(){
@Override
public void run(){
ArrayList list = new ArrayList();<span style="font-family: Arial, Helvetica, sans-serif;"> //通过各种运算来修改list的值</span>
Message msg = new Message();
msg.what = 0x000;//和主线程的匹配
msg.obj = list;
MainActivity.handler.sendMessage(msg);
}
}.start();
然后在主线程里面:
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
handler = new Handler(){
@Override
public void handleMessage(Message msg){
if(msg.what == 0x000) {
ArrayList list = (ArrayList)msg.obj;
//现在就可以运用在新线程里面弄好的arraylist的内容来对UI修改了。
}
}
};
}
这样就可以实现在非UI线程里面通过传递消息的方式来修改UI界面了。
@Hs_wwbin 2014-8-8 16:22