乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      android消息地址

       My鏡像站 2012-01-17

        消息機制雖然常用到,但這次寫的程序接觸到了Looper,覺得這篇文章不錯就轉載了下來,工作不忙但也不輕松,何時寫個原創(chuàng)呢?

      一、    角色描述

      1.Looper: 一個線程可以產生一個 Looper 對象,由它來管理此線程里的 Message Queue( 消息隊列 ) 。

      2.Handler: 你可以構造 Handler 對象來與 Looper 溝通,以便 push 新消息到 Message Queue 里;或者接收 Looper( Message Queue 取出 ) 所送來的消息。

      3. Message Queue( 消息隊列 ): 用來存放線程放入的消息。

      4 .線程: UI thread 通常就是 main thread ,而 Android 啟動程序時會替它建立一個 Message Queue

      每一個線程里可含有一個 Looper 對象以及一個 MessageQueue 數據結構。在你的應用程序里,可以定義 Handler 的子類別來接收 Looper 所送出的消息。

       

      在你的 Android 程序里,新誕生一個線程,或執(zhí)行 (Thread) 時,并不會自動建立其 Message Loop

      Android 里并沒有 Global Message Queue 數據結構,例如,不同 APK 里的對象不能透過 Massage Queue 來交換訊息 (Message) 。

      例如:線程 A Handler 對象可以傳遞消息給別的線程,讓別的線程 B C 等能送消息來給線程 A( 存于 A Message Queue ) 。

      線程 A Message Queue 里的訊息,只有線程 A 所屬的對象可以處理。

      使用 Looper.myLooper 可以取得當前線程的 Looper 對象。

      使用 mHandler = new EevntHandler(Looper.myLooper()); 可用來構造當前線程的 Handler 對象;其中, EevntHandler 是自已實現的 Handler 的子類別。

      使用 mHandler = new EevntHandler(Looper.getMainLooper()); 可誕生用來處理 main 線程的 Handler 對象;其中, EevntHandler 是自已實現的 Handler 的子類別。

       

      這樣描述可能太抽像,下面舉幾個實際的例子來說明:

      二、    舉例

      1. 同線程內不同組件間的消息傳遞

      Looper 類用來管理特定線程內對象之間的消息交換 (Message Exchange) 。你的應用程序可以產生許多個線程。而一個線程可以有許多個組件,這些組件之間常常需要互相交換訊息。如果有這種需要,您可以替線程構造一個 Looper 對象,來擔任訊息交換的管理工作。 Looper 對象會建立一個 MessageQueue 數據結構來存放各對象傳來的消息 ( 包括 UI 事件或 System 事件等 ) 。如下圖:

       

      每一個線程里可含有一個 Looper 對象以及一個 MessageQueue 數據結構。在你的應用程序里,可以定義 Handler 的子類別來接收 Looper 所送出的消息。

      同線程不同組件之間的消息傳遞:

      public class Activity1 extends Activity implements OnClickListener{

            Button button = null ;

            TextView text = null ;

            @Override

            protected void onCreate(Bundle savedInstanceState) {

                   super .onCreate(savedInstanceState);

                   setContentView(R.layout. activity1 );       

                   button = (Button)findViewById(R.id. btn );

                   button .setOnClickListener( this );

                   text = (TextView)findViewById(R.id. content );

            }

            public void onClick(View v) {

                   switch (v.getId()) {

                   case R.id. btn :

                          Looper looper = Looper.myLooper (); // 取得當前線程里的 looper

                          MyHandler mHandler = new MyHandler(looper); // 構造一個 handler 使之可與 looper 通信

                          //buton 等組件可以由 mHandler 將消息傳給 looper , 再放入 messageQueue , 同時 mHandler 也可以接受來自 looper 消息

                          mHandler.removeMessages(0);

                          String msgStr = " 主線程不同組件通信 : 消息來自 button" ;

                          Message m = mHandler.obtainMessage(1, 1, 1, msgStr); // 構造要傳遞的消息

                          mHandler.sendMessage(m); // 發(fā)送消息 : 系統(tǒng)會自動調用 handleMessage 方法來處理消息

                          break ;

       

                   }           

            }    

            private class MyHandler extends Handler{            

                   public MyHandler(Looper looper){

                          super (looper);

                   }

                   @Override

                   public void handleMessage(Message msg) { // 處理消息

                          text .setText(msg. obj .toString());

                   }           

            }

      }

       

      說明:

      此程序啟動時,當前線程 ( 即主線程 , main thread) 已誕生了一個 Looper 對象,并且有了一個 MessageQueue 數據結構。

         looper = Looper.myLooper ();

      調用 Looper 類別的靜態(tài) myLooper() 函數,以取得目前線程里的 Looper 對象 .

      mHandler = new MyHandler (looper);

      構造一個 MyHandler 對象來與 Looper 溝通。 Activity 等對象可以藉由 MyHandler 對象來將消息傳給 Looper ,然后放入 MessageQueue 里; MyHandler 對象也扮演 Listener 的角色,可接收 Looper 對象所送來的消息。

      Message m = mHandler.obtainMessage(1, 1, 1, obj);

      先構造一個 Message 對象,并將數據存入對象里。

      mHandler.sendMessage(m);

      就透過 mHandler 對象而將消息 m 傳給 Looper ,然后放入 MessageQueue 里。

      此時, Looper 對象看到 MessageQueue 里有消息 m ,就將它廣播出去, mHandler 對象接到此訊息時,會呼叫其 handleMessage() 函數來處理,于是輸出 "This my message!" 于畫面上,

       

      角色綜述(回顧) :

        (1)UI thread 通常就是 main thread ,而 Android 啟動程序時會替它建立一個 MessageQueue

      (2) 當然需要一個 Looper 對象,來管理該 MessageQueue 。

      (3) 我們可以構造 Handler 對象來 push 新消息到 Message Queue 里;或者接收 Looper( Message Queue 取出 ) 所送來的消息。

      (4) 線程 A Handler 對象可以傳遞給別的線程,讓別的線程 B C 等能送訊息來給線程 A( 存于 A Message Queue ) 。

      (5) 線程 A Message Queue 里的消息,只有線程 A 所屬的對象可以處理。

       

      子線程傳遞消息給主線程

      public class Activity2 extends Activity implements OnClickListener{

            Button button = null ;

            TextView text = null ;

            MyHandler mHandler = null ;

            Thread thread ;

            @Override

            protected void onCreate(Bundle savedInstanceState) {

                   super .onCreate(savedInstanceState);

                   setContentView(R.layout. activity1 );       

                   button = (Button)findViewById(R.id. btn );

                   button .setOnClickListener( this );

                   text = (TextView)findViewById(R.id. content );

            }

            public void onClick(View v) {

                   switch (v.getId()) {

                   case R.id. btn :

                          thread = new MyThread();

                          thread .start();

                          break ;

                   }           

            }    

            private class MyHandler extends Handler{            

                   public MyHandler(Looper looper){

                          super (looper);

                   }

                   @Override

                   public void handleMessage(Message msg) { // 處理消息

                          text .setText(msg. obj .toString());

                   }           

            }

            private class MyThread extends Thread{

                   @Override

                   public void run() {

                          Looper curLooper = Looper.myLooper ();

                          Looper mainLooper = Looper.getMainLooper ();

                          String msg ;

                          if (curLooper== null ){

                                 mHandler = new MyHandler(mainLooper);

                                 msg = "curLooper is null" ;

                          } else {

                                 mHandler = new MyHandler(curLooper);

                                 msg = "This is curLooper" ;

                          }

                          mHandler .removeMessages(0);

                          Message m = mHandler .obtainMessage(1, 1, 1, msg);

                          mHandler .sendMessage(m);

                   }           

            }

      }

      說明:

      Android 會自動替主線程建立 Message Queue 。在這個子線程里并沒有建立 Message Queue 。所以, myLooper 值為 null ,而 mainLooper 則指向主線程里的 Looper 。于是,執(zhí)行到:

      mHandler = new MyHandler (mainLooper);

      mHandler 屬于主線程。

        mHandler.sendMessage(m);

      就將 m 消息存入到主線程的 Message Queue 里。 mainLooper 看到 Message Queue 里有訊息,就會作出處理,于是由主線程執(zhí)行到 mHandler handleMessage() 來處理消息。

      下一節(jié)將會寫一個關于應多線程請求網絡數據的例子。

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多