@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