Android執行緒與訊息處理
1.建立執行緒 (1)通過Thread建立執行緒
Thread thread = new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub } }); 複製程式碼
(2)通過實現Runnable()介面建立執行緒
public class MainActivity extends Activity implements Runnable{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); @Override public void run() { // TODO Auto-generated method stub } } 複製程式碼
2.執行緒的開啟
thread.start(); 複製程式碼
3.執行緒的休眠
Thread.sleep(1000);//休眠1秒 複製程式碼
4.中斷執行緒
public class MainActivity extends Activity implements Runnable{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LooperThread thread = new LooperThread(); thread.start(); thread.interrupt(); } @Override public void run() { // TODO Auto-generated method stub while(!Thread.currentThread().isInterrupted()){ // do something } } } 複製程式碼
二、Handler訊息傳遞機制
前面介紹了現成的用法,不過不能在新建的子執行緒中對UI進行修改。如果要操作,會報錯Only the original thread that created a view hierarchy can touch its views。為此,Android引入Handler訊息傳遞機制,來實現線上程中操作UI介面。
1.迴圈者(Looper)簡介在Android中,一個執行緒對應一個Looper物件,一個Looper物件對應一個MessageQueue(訊息佇列)。MessageQueue用於存放message。在MessageQueue中,存放的訊息按照FIFO原則執行。
Looper物件用來為執行緒開啟一個訊息迴圈,從而操作MessageQueue。預設情況下,系統自動為主執行緒建立Looper物件,開啟訊息迴圈。所以,在主執行緒中用下面的程式碼建立Handler物件不會出錯,而在非主執行緒中則會報錯。
Handler handler = new Handler(); 複製程式碼
如果想在非主執行緒中建立Handler物件,必須用到Looper:
public class LooperThread extends Thread { public Handler h; @Override public void run() { // TODO Auto-generated method stub super.run(); Looper.prepare();// h = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub Log.i("Looper", String.valueOf(msg.what)); } }; Message m = h.obtainMessage(); m.what = 0x11; h.sendMessage(m); Looper.loop(); } } 複製程式碼
2.訊息處理類(Handler)簡介
Handler主要有以下兩個作用: (1)將Message或Runnable應用post()或sendMessage()方法傳送到MessageQueue中,傳送時可以指定延遲時間或者繫結的Bundle資料。當MessageQueue迴圈到該Message時,呼叫handlerMessage()方法對其處理。
(2)在子執行緒與主執行緒進行通訊,也就是在工作執行緒中與UI進行通訊
3.訊息類(Message)簡介Message具有如下5個屬性
1.arg1 int用來存放整型資料 2.arg2 int 用來存放整型資料 3.obj Object用來存放傳送給接收器的Object型別的任意物件 4.replyTo Messenger用來指定該Message該發往何處 5.what int使用者自定義訊息程式碼 在使用時,需要注意以下3點:
1.通常使用Message.obtain()或Handler.obtainMessage()獲取空訊息物件,以節省資源 2.如果一個Message只需要攜帶簡單的int資訊,優先使用arg1和arg2來傳遞,這比Bundle節省記憶體 3.儘可能用Message.what來標識資訊