Android如何使用Handler

@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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章