Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android線程間的通信

Android線程間的通信

編輯:Android開發實例

  andriod提供了 Handler 和 Looper 來滿足線程間的通信。例如一個子線程從網絡上下載了一副圖片,當它下載完成後會發送消息給主線程,這個消息是通過綁定在主線程的Handler來傳遞的。

  在Android,這裡的線程分為有消息循環的線程和沒有消息循環的線程,有消息循環的線程一般都會有一個Looper,這個是android的新概念。我們的主線程(UI線程)就是一個消息循環的線程。針對這種消息循環的機制,我們引入一個新的機制Handler,我們有消息循環,就要往消息循環裡面發送相應的消息,自定義消息一般都會有自己對應的處理,消息的發送和清除,把這些都封裝在Handler裡面,注意Handler只是針對那 些有Looper的線程,不管是UI線程還是子線程,只要你有Looper,我就可以往你的消息隊列裡面添加東西,並做相應的處理。
  但是這裡還有一點,就是只要是關於UI相關的東西,就不能放在子線程中,因為子線程是不能操作UI的,只能進行數據、系統等其他非UI的操作。

  class ChildThread extends Thread { 

      public void run() {

        /*
   * 創建 handler前先初始化Looper.
   */

          Looper.prepare();

        /*
   * 在子線程創建handler,所以會綁定到子線程的消息隊列中
   *
   */

          mChildHandler = new Handler() {

              public void handleMessage(Message msg) {

 

                  /*
            * Do some expensive operations there.
         */

              }

          };

          /*

           * 啟動該線程的消息隊列

           */

          Looper.loop();

      }

  }

  當Handler收到消息後,就會運行handleMessage(…)的回調函數,可以在裡面做一些耗時的操作。

  最後完成了操作要結束子線程時,記得調用quit()來結束消息循環隊列。

  mChildHandler.getLooper().quit();

  下面是一個線程間通信的小例子:

 public class MainThread extends Activity {

   private static final String TAG = "MainThread";
   private Handler mMainHandler, mChildHandler;
   private TextView info;
   private Button msgBtn;

   @Override
   public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);

   info = (TextView) findViewById(R.id.info);
   msgBtn = (Button) findViewById(R.id.msgBtn);

   mMainHandler = new Handler() {
 
   @Override
   public void handleMessage(Message msg) {
   Log.i(TAG, "Got an incoming message from the child thread - "
   + (String) msg.obj);
   // 接收子線程的消息
   info.setText((String) msg.obj);
   }

   };

   new ChildThread().start();


   msgBtn.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {

   if (mChildHandler != null) {

   //發送消息給子線程
   Message childMsg = mChildHandler.obtainMessage();
   childMsg.obj = mMainHandler.getLooper().getThread().getName() + " says Hello";
   mChildHandler.sendMessage(childMsg);

   Log.i(TAG, "Send a message to the child thread - " + (String)childMsg.obj);


   }
   }
   });

   }

   public void onDestroy() {
        super.onDestroy();
   Log.i(TAG, "Stop looping the child thread's message queue");

   mChildHandler.getLooper().quit();
  }

   class ChildThread extends Thread {

   private static final String CHILD_TAG = "ChildThread";

   public void run() {
   this.setName("ChildThread");

   //初始化消息循環隊列,需要在Handler創建之前
   Looper.prepare();

   mChildHandler = new Handler() {
   @Override
   public void handleMessage(Message msg) {
   Log.i(CHILD_TAG, "Got an incoming message from the main thread - " + (String)msg.obj);


   try {

   //在子線程中可以做一些耗時的工作
   sleep(100);

   Message toMain = mMainHandler.obtainMessage();
   toMain.obj = "This is " + this.getLooper().getThread().getName() +". Did you send me \"" + (String)msg.obj + "\"?";

   mMainHandler.sendMessage(toMain);
  
   Log.i(CHILD_TAG, "Send a message to the main thread - " + (String)toMain.obj);

   } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   }
  }

   };

   Log.i(CHILD_TAG, "Child handler is bound to - "+ mChildHandler.getLooper().getThread().getName());

   //啟動子線程消息循環隊列
   Looper.loop();
   }
  }
  }

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved