android中的進程與線程的理解 – Android移動開發技術文章_手機開發 Android移動開發教學課程

 

一個android應用就是一個Linux進程,每個應用在各自的進程中運行,互不幹擾,比較安全。

 

一個應用對應一個主線程,就是通常所說的UI線程,android遵守的就是單線程模型,所以說Ui操作不是線程安全的。CalledFromWrongThreadException通常就是在非主線程中刷新UI引起的。

 

在單線程的模型下,一些耗時的操作就要交給其它子線程去執行。於是就有瞭Message Queue(消息隊列),輔助線程間進行通信。每個線程都可以有自己的Message Queue,特別的是主線程中的消息對列是系統生成的,每個MessageQueue都會有一個對應的handler,其它子線程中要想有自己的消息隊列必須手動生成。管理消息隊列的是Looper,每個進程都有自己的Looper。子線程中Message Queue 的生成必須依賴於Looper,Looper一旦開始loop後,它就會一直監控著消息隊列,對send進來的Message進行處理。先進先出。一旦處理完一條Message,那麼該Message馬上就會被置為null。當傳送過來很多的消息時,不知道交給哪個線程執行時,可以判斷當前這個傳送消息過來的handler裡面的Looper對象是屬於哪個線程的,屬於哪個線程就在哪個線程裡執行。

 

1,一個Handler可以通過它的構造函數來個它設置looper.

 

                Handler handler = new Handler(getMainLooper());

 

2,在子線程中handler通過sendMessage將消息傳到擁有當前Handler對象的那個線程中,利用hadlerMessage來處裡。

 

www.aiwalls.com

Handler handerHandler = new Handler() {

        @Override

        public void handleMessage(Message msg) {

            switch (msg.what) {

            case 0:

                case 1:

                    break;

        }

            super.handleMessage(msg);

        }

    };

 

3,Handler向MessageQueue發送消息除瞭sendMessage之外還有post也可以,它發的是一個unnable會自動執行。

 

  handler.post(new Runnable()

        {

            @Override

            public void run()

            {

             

               

            }

        });

4,在子線程中創建自己的消息隊列,並監控次消息隊列。

 

Class A implements Runnable{

 

Handelr handler;

 

  public void run() {

 

Looper.prepare();

 

handler = new Handler(){

 

public void handleMessage(Message msg) {

 

}

 

             }

 

Looper.loop();

 

}

 

}

 

在java.util.concurrent 框架中給我們提供瞭另外一個工具AsyncTask,它的特點是任務在主線程之外運行,而回調方法是在主線程中執行,這就有效地避免瞭使用Handler帶來的麻煩(匿名線程開銷大,如果每個任務都要創建一個線程,那效率就上不來瞭。匿名線程難以管理)。

 

摘自 yuxlong2010的專欄

發佈留言