創作內容

14 GP

Android Thread Handler

作者:貓貓風 ฅ●ω●ฅ│2017-08-11 23:36:06│巴幣:36│人氣:560
.

















執行緒的效用主要就是用來處理龐大/複雜/耗時的運算,避免這些動作影響到主執行緒

因此會另開其他副執行緒來處理這些事情

至於在執行緒中UI的更新方式這邊介紹的方式就是Android特有的

像如果是C#的話正統就是用delegate委派;如果是Android就是用Handler

Handler負責傳送訊息交給MessageQueue進行排程
 
再透過Looper將每一個Message Object丟給Handler處理

以下為簡單的執行緒建立與UI更新


  1. package com.example.mikumiku999.threadtest;  
  2.   
  3. import android.os.Bundle;  
  4. import android.os.Handler;  
  5. import android.os.HandlerThread;  
  6. import android.os.Message;  
  7. import android.support.v7.app.AppCompatActivity;  
  8. import android.view.View;  
  9. import android.widget.Button;  
  10. import android.widget.EditText;  
  11.   
  12.   
  13. public class MainActivity extends AppCompatActivity {  
  14.   
  15.     private Handler mUI_Handler=new Handler();  
  16.   
  17.     private Handler mThreadHandler;  
  18.     private HandlerThread mThread;  
  19.     private final static int UPDATE = 3;  
  20.     private Handler handler ;  
  21.   
  22.     private Button start;  
  23.     private int count = 0,runcount = 0;  
  24.     private EditText num;  
  25.     private boolean isOPen = true;  
  26.     @Override  
  27.     protected void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.activity_main);  
  30.         start = (Button)findViewById(R.id.click);  
  31.         num = (EditText)findViewById(R.id.editText);  
  32.   
  33.        handler = new Handler()  
  34.         {  
  35.             @Override  
  36.             public void handleMessage(Message msg)  
  37.             {  
  38.                 switch (msg.what)  
  39.                 { case UPDATE:  
  40.                     num.setText(String.valueOf(msg.arg1));  
  41.                     break;  
  42.                 }  
  43.             }  
  44.         };  
  45.   
  46.   
  47.         start.setOnClickListener(new View.OnClickListener(){ //當按下send開始  
  48.             @Override  
  49.             public void onClick(View v){  
  50.                 runcount++;  
  51.                 if(runcount>=2) {  
  52.                     isOPen = false;  
  53.                     if (mThread != null)  
  54.                         mThread.quit();  
  55.                 }  
  56.                 try {  
  57.                     Thread.sleep(1000);  
  58.                 } catch (InterruptedException e) {  
  59.                     e.printStackTrace();  
  60.                 }  
  61.                 isOPen = true;  
  62.                 mThread=new HandlerThread("TH1");  
  63.                 mThread.start();  
  64.                 mThreadHandler=new Handler(mThread.getLooper());  
  65.                 mThreadHandler.post(r1);  
  66.             }  
  67.         });  
  68.   
  69.     }  
  70.   
  71.     private Runnable r1=new Runnable(){  
  72.   
  73.         public void run(){  
  74.   
  75.             count = 0;  
  76.             while (isOPen)  
  77.             {  
  78.                 count++;  
  79.                 handler.obtainMessage(UPDATE, count, -1)  
  80.                                 .sendToTarget();    
  81.                 try {  
  82.                     Thread.sleep(1000);  
  83.                 } catch (InterruptedException e) {  
  84.                     e.printStackTrace();  
  85.                 }  
  86.             }  
  87.         }    
  88.     };  
  89.     @Override  
  90.   
  91.     protected void onDestroy(){  
  92.   
  93.         super.onDestroy();  
  94.   
  95.         if(mThreadHandler != null){  
  96.             mThreadHandler.removeCallbacks(r1);  
  97.         }  
  98.   
  99.         if(mThread != null){  
  100.             mThread.quit();  
  101.         }    
  102.     }    
  103. }  


程式一開始會先宣告處理UI的Handler mUI_Handler

接著宣告執行緒的Handler mThreadHandler

最後宣告執行緒 HandlerThread mThread

然後在程式一開始建構的時候初始化Handler 要做的事情

handler.obtainMessage(UPDATE, count, -1).sendToTarget();

Message.What 表示 obtainMessage中的第一個參數 UPDATE
Message.arg1 表示 obtainMessage的第二個參數 count

依此類推   可以參考下圖解說



在按下Button後會建立一個執行緒 mThread

給訂名稱為 TH1 後 起動執行緒 mThread.start();

將執行緒綁定 mThreadHandler 將內容 POST給Runnable 做

Runnable 中執行Run將執行無窮迴圈,每一秒將值+1並顯示在螢幕上

執行結果如下圖,按下Start後開始計數;當在按下時停止關閉執行緒計數




引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3679985
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:涼涼風

留言共 9 篇留言

約瑟森林的一枚白伊
第一個留言 這樣顯的我可能看的懂

08-11 23:39

貓貓風 ฅ●ω●ฅ
[e39]08-11 23:40
珀伽索斯(Ama)
整個看下來,讓我想起以前我在大學時期學過這類的東西,
讓人非常的懷念,若有工具要做還是可以的。[e34]

08-11 23:44

貓貓風 ฅ●ω●ฅ
不過安裝開發環境要能夠執行電腦需要比較好一些才跑的動@_@08-11 23:46
Azkic
居然能有如此海量的教學可以教[e18]......實在太厲害啦!?[e17]
平常一定很認真的在學習新知識

08-11 23:52

貓貓風 ฅ●ω●ฅ
謝謝你唷,其實也沒有很認真啦 算是夾雜一點點興趣在裡面XD
感謝來我的小屋逛逛喔^^08-11 23:54
小刀
厲害~很讚的說~

08-11 23:52

貓貓風 ฅ●ω●ฅ
謝謝刀姊的稱讚^^08-11 23:55
彩゛天空゜
能不能把star改成 star burst stream

08-12 00:07

貓貓風 ฅ●ω●ฅ
要改的話會改成這樣 star_burst_stream08-12 00:10
彩゛天空゜
真棒改這樣程式跑比較快

08-12 03:31

貓貓風 ฅ●ω●ฅ
好喔 O _ O08-12 12:00
雪雪
最近好像都沒看到貓貓,貓貓是不是比較忙呢(ㆁωㆁ*)
啊你說我怎麼沒有討論日誌內容,蛤?你說什麼?(≧▽≦)XD

08-12 06:33

貓貓風 ฅ●ω●ฅ
事比較忙沒錯喔 雪雪觀察入微><08-12 12:01
Arthur
厲害的貓貓風 [e34]

08-12 08:14

貓貓風 ฅ●ω●ฅ
桑Q08-12 12:01
Fuwawa
豪酷的感覺 窩仍然看ㄅ懂

08-12 12:38

貓貓風 ฅ●ω●ฅ
這次的事手機程式XD08-12 12:55
我要留言提醒:您尚未登入,請先登入再留言

14喜歡★s1234567 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:arduino 藍芽通信... 後一篇:鼠繪217 - 動物朋友...

追蹤私訊切換新版閱覽

作品資料夾

zxp915415各位
大家好,花亦山同人小說:先生成了我夫君,已更新到第二十九~歡迎各位來看看喔!看更多我要大聲說昨天14:48


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】