android之handler使用–對於非同步訊息的處理

來源:互聯網
上載者:User

android裡面對於非同步訊息的處理,提供了一套Handler的實現方案。Handler有很多適宜的應用和微妙之處,使它在和Thread以及Service等一起使用的時候達到很好的效果。
一. Handler與Thread的區別。Handler與調用者處於同一線程,如果Handler裡面做耗時的動作,調用者線程會阻塞。Android UI操作不是安全執行緒的,並且這些操作必須在UI線程中執行。Android提供了幾種基本的可以在其他線程中處理UI操作的方案,包括Activity的runOnUiThread(Runnable),View的post以及1.5版本的工具類AsyncTask等方案都採用了Handler,Handler的post對線程的處理也不是真正start一個新的線程,而是直接調用了線程的run方法,這正是google煞費苦心搞一套Handler的用意。
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      startThread();
      // sendMessage();
      SystemClock.sleep(2000);
      setContentView(R.layout.main);

   }

   public void startThread() {
      mThread.start();
   }

   public void sendMessage() {
      MHandler mHandler = new MHandler();
      Message msg = mHandler.obtainMessage();
      msg.sendToTarget();
   }

   class MHandler extends Handler {
      public MHandler() {
      }

      public MHandler(Looper l) {
        super(l);
      }

      @Override
      public void handleMessage(Message msg) {
        int count = 0;
        while (count++ MAX_VALUE) {
           Log.d(TAG, "Rintail");
        }
      }
   }

   Thread mThread = new Thread() {
      @Override
      public void run() {
        int count = 0;
        while (count++ MAX_VALUE) {
           Log.d(TAG, "Rintail");
        }
      }
   };

二.    Handler對於Message的處理不是並發的。一個Looper 只有處理完一條Message才會讀取下一條,所以訊息的處理是阻塞形式的。但是如果用不同的Looper則能達到並發的目的。Service中,onStart的執行也是阻塞的。如果一個startService在onStart執行完成之前,再次條用startService也會阻塞。如果希望能儘快的執行onStart則可以在onStart中使用handler,因為Message的send是非阻塞的。如果要是不同訊息的處理也是並發的,則可以用不同的Looper執行個體化Handler。

   public void onStart(Intent intent, int startId) {
      super.onStart(intent, startId);
      sendMessageWithLooper();
      //sendMessage();
   }

   public void sendMessage() {
      MHandler mHandler = new MHandler();
      Message msg = mHandler.obtainMessage();
      msg.sendToTarget();
   }

   public void sendMessageWithLooper() {
      HandlerThread ht = new HandlerThread("Rintail");
      ht.start();
      MHandler mHandler = new MHandler(ht.getLooper());
      Message msg = mHandler.obtainMessage();
      msg.sendToTarget();
   }

   class MHandler extends Handler {

      public MHandler() {
      }

      public MHandler(Looper l) {
        super(l);
      }

      @Override
      public void handleMessage(Message msg) {
        Log.d(TAG, "first");
        while (true) {
           if (false)
              break;
        }
        Log.d(TAG, "second");
      }
   };

   class MyThread extends Thread {

      @Override
      public void run() {
        Log.d(TAG, "first");
        while (true) {
           if (false)
              break;
        }
        Log.d(TAG, "second");
      }
   };

三。  資源回收
向Handler對象發送類似new Message ()形式的空Message可以達到清空Message的目的,這種做法與getLooper().quit()的做法是一樣的。如果利用的資源較多,應及時清理。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.