Handler與Android多線程

下面是一段你們都比較熟悉的代碼:

Handler handler = new Handler();
handler.post(myThread);

//使用匿名內部類建立一個線程myThread
Runnable mythread = new Runnable() {
public void run() {
}
};

一開始,相信不少人都覺得myThread中的run()方法會在一個新的線程中運行,但事實並不是如此。
上述代碼中的handler並無調用線程myThread的start()方法,而是直接調用了run()方法,這也就意味着實際上並無建立一個新的線程,只是在當前線程中調用run()方法而已。

這牽扯出一個問題,若是咱們將一個很耗時的操做放到了run()方法內,而後使用一個Handler對象將該線程post到線程隊列。本來咱們但願將這些耗時操做放到另一個線程中,以避免影響當前進程。但實際上卻偏偏相反:post()如下的那些代碼必須等到run()方法執行完畢後才能繼續執行。如當前線程爲主線程,那麼主程序便會處於硬直狀態。

那麼應該如何去實現真正的多線程呢?

一種最簡便的方法就是直接利用JAVA中的實現多線程的方法,即創建一個Thread對象,而後調用start()方法。

還有另一種方法,代碼以下:

//HandlerThread創建了一個新線程,它包含一個Looper
HandlerThread handlerThread = new HandlerThread("handler_Thread");
handlerThread.start(); //啓動一個線程
MyHandler myHandler = new MyHandler(handlerThread.getLooper()); //使用新線程的Looper創建一個Handler
//此時MyHandler便與一個新線程綁定到一塊兒了

Message msg = myHandler.obtainMessage();
msg.sendToTarget(); //將message壓入提供message的Handler的消息隊列中

//創建一個Handler的子類
class MyHandler extends Handler {
MyHandler(Looper looper) {
super(looper);
}
public void handleMessaage(Message msg) {
//處理消息的代碼
}
}


今天我又仔細的看了一下Android文檔,發現android雖然支持上兩種創建線程的方法,可是它有一個規則:
原文是:it violates the second rule of the single-threaded model: do not access the Android UI toolKit from outside the UI thread.
大概意思就是:Android不支持在UI線程之外的線程中修改UI控件。好比給一個Textview設置文字,這樣的操做便不能放在UI線程之外的線程內執行,不然便會出現異常。

關於android多線程,Android還提供了一個AsyncTask類,用來實現多線程。
相關文章
相關標籤/搜索