Sub Thread to update main Thread (UI) 2

來源:互聯網
上載者:User

標籤:android   style   blog   color   os   io   使用   ar   art   

Sub Thread to update main Thread (UI)  2     

     Handler.post(somethread);

     Handler.sendMessage("Msg");

 

 1 import android.app.Activity; 2     import android.os.Bundle; 3     import android.os.Handler; 4     import android.os.Message; 5     import android.util.Log; 6     import android.view.View; 7     import android.widget.Button; 8     import android.widget.ProgressBar; 9      10     public class HandlerActivity extends Activity {11          12         Button btnStart,btnEnd;13         ProgressBar proBar;14          15         /** Called when the activity is first created. */16         @Override17         public void onCreate(Bundle savedInstanceState) {18             super.onCreate(savedInstanceState);19             setContentView(R.layout.main);20              21             //通過控制項的ID來執行個體化控制項對象22              btnStart = (Button)findViewById(R.id.start);23             btnEnd = (Button)findViewById(R.id.end);24             proBar = (ProgressBar)findViewById(R.id.pBar);25              26             //開始按鈕觸發事件27             btnStart.setOnClickListener(new View.OnClickListener() {28                  29                 @Override30                 public void onClick(View v) {31                     proBar.setVisibility(View.VISIBLE);32                     <span style="color: #ff0000;">updateBarHandler.post(updateBarThread);</span>33                 }34             });35              36             //結束按鈕觸發事件37             btnEnd.setOnClickListener(new View.OnClickListener() {38                  39                 @Override40                 public void onClick(View v) {41                     <span style="color: #ff0000;">updateBarHandler.removeCallbacks(updateBarThread);</span>42                 }43             });44         }45          46          47          //建立一個Handler對象48          Handler updateBarHandler = new Handler(){49      50             @Override51             public void handleMessage(Message msg) {52                 proBar.setProgress(msg.arg1);53                 54                 //REPEAT55                  updateBarHandler.post(updateBarThread);56             }57              58         };59          60         //更新ProgressBar的線程對象61         Runnable updateBarThread = new Runnable() {62             int i = 0;63             @Override64             public void run() {65                 i = i + 10;66                 Message msg = updateBarHandler.obtainMessage();67                 msg.arg1 = i;68                 try{69                     Thread.sleep(2000);70                 }catch (InterruptedException e) {71                     e.printStackTrace();72                 }73                 updateBarHandler.sendMessage(msg);74                 if(i == 100){75                     updateBarHandler.removeCallbacks(updateBarThread);76                 }77             }78         };79     }80      

 

解釋:

使用Handler的大致流程:

1.首先建立一個Handler對象,可以直接使用Handler無參建構函式建立Handler對象,也可以繼承Hander類,重寫HandleMessage方法來建立Handler對象

2.在監聽器中,調用Handler的post方法,將要執行的線程對象加到線程隊列當中。此時將會把線程對象添加到handler對象的線程隊列中

3.將要執行的操作寫線上程對象的run方法中,一般一個Runnable對象,複寫其中的run方法就可以了。

 

   Handler包含了兩個隊列,其中一個是線程隊列,另外一個是訊息佇列。使用post方法會將線程對象放到該handler的線程隊列中,使用sendMessage將訊息放到訊息佇列中。

 

   如果想要在這個流程一直執行的話,可以在run方法內部執行postDelayed或者post方法,再將該線程對象添加到訊息佇列中,重複執行。想要線程停止執行,調用Handler對象的removeCallbacks方法,從線程隊列中移除線程對象,是線程停止執行。

 

   Handler為Android提供了一種非同步訊息處理機制,當向訊息佇列中發送訊息(sendMessage)後就立即返回,而從訊息佇列中讀取訊息時會阻塞,其中訊息佇列中讀取訊息時會執行Handler中的public void handleMessage方法,因此在建立Handler時,應該使用匿名內部類重寫該方法,在該方法中寫上讀取到訊息後的操作,使用Handler的obtainMessage()來獲得訊息的對象。

  

   Handler與線程的關係:

   使用Handler的post方法將Runable對象放到Handler的線程隊列中後,該Runnalbe的執行其實並未單獨開啟線程,而是仍然在當前Activity線程中執行的,Handler只是調用了Runable對象的run方法。

    

   如何讓Handler執行Runnable時開啟新的線程:

   1.首先產生一個HandlerThread對象,實現了使用Looper來處理訊息佇列的功能,這個類由Android應用程式架構提供。

   HandlerThread handlerThread=new HandlerThread(“handler_thread”);

   2.在使用HandlerThread的getLooper()方法之前,必須先調用該類的start();

   3.根據這個HandlerThread對象得到其中的Looper對象。

   4.建立自訂的繼承於Handler類的子類,其中實現一個參數為Looper對象的構造方法,方法內容調用父類的建構函式即可。

   5.使用第三步得到的Looper對象建立自訂的Handler子類的對象,再將訊息發送到該Handler的訊息佇列中,Handler複寫的handleMessage()將會執行來處理訊息佇列中的訊息。

   訊息,即Message對象,可以傳遞一些資訊,可以使用arg1,arg2,Object傳遞一些整形或者對象,還可以使用Message對象的setData(Bundle bundle)來將Bundle對象傳遞給新建立的線程,新建立的線程在執行handleMessage時可以從message中利用getData()提取出Bundle對象進行處理。

 

Sub Thread to update main Thread (UI) 2

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.