91亚洲精华国内精华精华液_国产高清在线精品一区不卡_精品特级一级毛片免费观看_欧美日韩中文制服有码_亚洲精品无码你懂的网站369

 

android handler消息機制

(2011-04-10 23:33:23)

轉(zhuǎn)載

 

 

 

標簽:

雜談

 

 

 

Android筆記--handler機制 
一、重要參考資料
【參考資料】
  目前來看,下面的幾個網(wǎng)址中的內(nèi)容質(zhì)量比較不錯,基本不需要再讀別的網(wǎng)址了。
1、android消息機制一
  http://xtfncel.javaeye.com/blog/663517
2、Android消息機制二
  http://xtfncel.javaeye.com/blog/663518
3、Android線程間通信的message機制
  http://www.javafun.cn/viewthread.php?tid=1517
4、


5、Android中Handler的使用方法-在子線程中更新界面
  http://blog.csdn.net/yangpeng98/archive/2010/05/26/5625955.aspx
 
二、知識要點
一、知識點
1、handler應(yīng)該由處理消息的線程創(chuàng)建。

2、handler與創(chuàng)建它的線程相關(guān)聯(lián),而且也只與創(chuàng)建它的線程相關(guān)聯(lián)。handler運行在創(chuàng)建它的線程中,所以,如果在handler中進行耗時的操作,會阻塞創(chuàng)建它的線程。
【來源】以上來自:
二、一些知識點
1、Android的線程分為有消息循環(huán)的線程和沒有消息循環(huán)的線程,有消息循環(huán)的線程一般都會有一個Looper。主線程(UI線程)就是一個消息循環(huán)的線程。


2、
Looper.myLooper();     //獲得當前的Looper
Looper.getMainLooper () //獲得UI線程的Lopper


3、Handle的初始化函數(shù)(構(gòu)造函數(shù)),如果沒有參數(shù),那么他就默認使用的是當前的Looper,如果有Looper參數(shù),就是用對應(yīng)的線程的Looper。


4、如果一個線程中調(diào)用Looper.prepare(),那么系統(tǒng)就會自動的為該線程建立一個消息隊列,然后調(diào)用 Looper.loop();之后就進入了消息循環(huán),這個之后就可以發(fā)消息、取消息、和處理消息。
【來源】以上來自:http://www.javafun.cn/viewthread.php?tid=1517


三、應(yīng)用實例
3.1 handler傳遞message
【應(yīng)用示例一】
package com.android.tutor; 
import java.util.Timer; 
import java.util.TimerTask; 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
public class HandlerDemo extends Activity { 
     
   //title為setTitle方法提供變量,這里為了方便我設(shè)置成了int型 
   private int title = 0; 
     
   private Handler mHandler = new Handler(){ 
         
       public void handleMessage(Message msg) { 
           switch (msg.what) { 
           case 1: 
               updateTitle(); 
               break; 
           
       }; 
   }; 
   public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 
         
       Timer timer = new Timer(); 
       timer.scheduleAtFixedRate(new MyTask(), 1, 5000); 
   
         
   private class MyTask extends TimerTask{ 
       @Override 
       public void run() { 
             
           Message message = new Message(); 
           message.what = 1; 
           mHandler.sendMessage(message); 
             
          
   
     
     
   public void updateTitle(){ 
         
       setTitle("Welcome to Mr Wei's blog " + title); 
       title ++; 
   

 

源碼來自:http://blog.csdn.net/Android_Tutor/archive/2010/05/08/5568806.aspx


上面的代碼,直接在主線程中定義Handler成員。在子線程中通過主線程的handler向主線程發(fā)送消息。其使用步驟如下:
1、在主線程中定義handler,并為這個handler實現(xiàn)handleMessage方法。
2、在子線程中調(diào)用主線程的handler,通過其sendMessage方法發(fā)送消息。


【應(yīng)用示例二】

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);//構(gòu)造一個handler使之可與looper通信

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

                    mHandler.removeMessages(0);

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

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

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

                    break;

 

                        

          

      private class MyHandler extends Handler{             

             public MyHandler(Looper looper){

                    super(looper);

             }

             @Override

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

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

                        

      }

}

 

這是另一種使用handler的方法是可以派生一個Handler的子類,在子類中實現(xiàn)handleMessage方法。
1、定義Handler的派生類,并在子類中實現(xiàn)handleMessage方法。
2、在主線程的類中,定義該子類的對象。
3、在子線程中,調(diào)用主線程中的對象。


3.2 handler傳遞runnable對象
還有另外一種用Handler來進行線程間通信的方式,那就是用Handler來傳遞一個runnable對象,而不是一個message。
【應(yīng)用實例三】

 

 


使用步驟
1、在主線程中定義Handler對象
2、構(gòu)造一個runnable對象,為該對象實現(xiàn)runnable方法,在該方法中進行一些你想做的耗時操作。
3、在子線程中使用Handler對象post(runnable)對象.

 

穩(wěn)定

產(chǎn)品高可用性高并發(fā)

貼心

項目群及時溝通

專業(yè)

產(chǎn)品經(jīng)理1v1支持

快速

MVP模式小步快跑

承諾

我們選擇聲譽

堅持

10年專注高端品質(zhì)開發(fā)
  • 返回頂部