Android Handler+Thread實現更新Ui

來源:互聯網
上載者:User

Android不允許activity新啟動的線程訪問該activity裡的介面組件,這樣就導致新啟動的線程無法動態改變介面組件的屬性值,但在實際開發中,尤其設計動畫的遊戲開發中,需要讓新啟動的線程周期性的改變介面組件的屬性值,這是就需要藉助於Handler的訊息傳遞機制來實現了。

Handler類的主要作用有兩個:

1.       在新啟動的線程中發送訊息

2.       在主線程中擷取、處理訊息

這個過程設計一個問題:新啟動的線程何時發送訊息呢?主線程何時去擷取並處理訊息呢?

為了讓主線程能“適時”地處理新啟動的線程所發送的訊息,顯然只能通過回調的方式來實現,開發人員需要做的就是,重寫Handler類中處理訊息的方法,當新線程發送訊息時,Handler類中處理訊息的方法將自動被回調。

Handler類的方法比較多,現列舉幾個常用方法:

1、voidhandleMessage(Message msg) ;用於處理訊息的方法,該方法通常用於被重寫

2、final boolean  hasMessages(int what) :檢查訊息佇列中是否包含參數what為指定值的訊息

3、final boolean  hasMessages(int what, Object object):檢查訊息佇列中是否包含參數what為指定值且參數object為指定對象的訊息

4、final Message  obtainMessage():從訊息池中擷取訊息

5、final boolean  sendEmptyMessage(int what):發送空訊息

6、final boolean  sendEmptyMessageDelayed(int what, long delayMillis):指定多少毫秒之後發送空訊息

7、final boolean  sendMessage(Message msg):立即發送訊息

8、final boolean  sendMessageDelayed(Message msg, long delayMillis):指定多少毫秒之後發送訊息

 

程式通過上面幾個方法,就可以實現方便的實現訊息傳遞了!

 

貼上代碼:

[java]
<SPAN style="FONT-SIZE: 14px">package com.test.handler; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.widget.TextView; 
 
public class MainActivity extends Activity { 
    private int MESSAGE = 1; 
    private TextView mTextView; 
    private String temp = "線程每隔2秒處理一次"; 
    private Thread mThread; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        mTextView = (TextView) findViewById(R.id.handTextView); 
 
        // 僅Thread實現  
        thread.start();// 啟動線程  
 
        // //Runnable實現  
        // mThread = new Thread(mRunnable);  
        // mThread.start();  
 
        // 這個算是最簡潔的方式了  
        // mTextView.post(new Runnable() {  
        //  
        // @Override  
        // public void run() {  
        // Message message=new Message();  
        // message.what=MESSAGE;  
        // mHandler.sendMessage(message);  
        // }  
        // });  
    } 
 
    // 由Handler的handleMessage方法處理更新ui  
    Handler mHandler = new Handler() { 
        @Override 
        public void handleMessage(Message msg) {// 該方法在主線程中運行  
            super.handleMessage(msg); 
            switch (msg.what) { 
            case 1: 
                mTextView.setText(temp); 
                break; 
            default: 
                break; 
            } 
        } 
    }; 
 
    // Thread實現  
    Thread thread = new Thread() { 
        @Override 
        public void run() {// 新建立的線程  
            super.run(); 
            for (int i = 0; i < 100; i++) { 
                try { 
                    sleep(2000);// 暫停2秒再發送訊息  
                    temp = temp + i; 
                    // 第一種發送訊息的方式  
                    // Message message = new Message();  
                    // message.what = MESSAGE;  
                    // mHandler.sendMessage(message);  
 
                    // 第二種發送訊息的方式,推薦使用這種  
                    Message message = mHandler.obtainMessage(); 
                    mHandler.obtainMessage(MESSAGE).sendToTarget(); 
 
                } catch (InterruptedException e) { 
                    e.printStackTrace(); 
                } 
            } 
 
        } 
    }; 
 
    // Runnable實現  
    Runnable mRunnable = new Runnable() { 
        @Override 
        public void run() { 
            for (int i = 0; i < 100; i++) { 
                try { 
                    Thread.sleep(2000);// 暫停2秒再發送訊息  
                    temp = temp + i; 
 
                    // 第一種發送訊息的方式  
                    // Message message = new Message();  
                    // message.what = MESSAGE;  
                    // mHandler.sendMessage(message);  
 
                    // 第二種發送訊息的方式,推薦使用這種  
                    Message message = mHandler.obtainMessage(); 
                    mHandler.obtainMessage(MESSAGE).sendToTarget(); 
 
                } catch (InterruptedException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
    }; 
 

</SPAN> 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.