• <kbd id="qyk40"></kbd>
  • <strike id="qyk40"></strike><samp id="qyk40"><pre id="qyk40"></pre></samp>

     

    android handler消息機制

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

    轉載

     

     

     

    標簽:

    雜談

     

     

     

    Android筆記--handler機制 
    一、重要參考資料
    【參考資料】
      目前來看,下面的幾個網址中的內容質量比較不錯,基本不需要再讀別的網址了。
    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應該由處理消息的線程創建。

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


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


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


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


    三、應用實例
    3.1 handler傳遞message
    【應用示例一】
    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方法提供變量,這里為了方便我設置成了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向主線程發送消息。其使用步驟如下:
    1、在主線程中定義handler,并為這個handler實現handleMessage方法。
    2、在子線程中調用主線程的handler,通過其sendMessage方法發送消息。


    【應用示例二】

    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);//發送消息:系統會自動調用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的子類,在子類中實現handleMessage方法。
    1、定義Handler的派生類,并在子類中實現handleMessage方法。
    2、在主線程的類中,定義該子類的對象。
    3、在子線程中,調用主線程中的對象。


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

     

     


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

     

    穩定

    產品高可用性高并發

    貼心

    項目群及時溝通

    專業

    產品經理1v1支持

    快速

    MVP模式小步快跑

    承諾

    我們選擇聲譽

    堅持

    10年專注高端品質開發
    • 返回頂部
    精品午夜国产福利观看| 国产精品成人不卡在线观看| 国产乱人伦精品一区二区| 亚洲AV午夜福利精品一区二区| 国产成人久久精品| 骚片AV蜜桃精品一区| 亚洲日韩精品国产一区二区三区| 久久久久久九九精品久小说| 中文字幕日韩一区| 777亚洲精品乱码久久久久久| 亚洲福利精品一区二区三区| 亚洲精品自偷自拍无码| 久久线看观看精品香蕉国产| 中文字幕无码亚洲欧洲日韩| 国内精品国语自产拍在线观看91| 久久国产精品只做精品| 国产日韩AV在线播放| 无码人妻精品一区二区三区99性 | 国产成人精品无码一区二区老年人| 亚洲AV永久无码精品一福利| 国产成人精品优优av| 国内精品久久久久久不卡影院| 国产精品午夜电影| 中文字幕精品一区影音先锋| 久久久久99精品国产片 | 无码人妻精品一区二区三区久久久 | 99久久er热在这里只有精品99| A级精品国产片在线观看| 韩国精品一区视频在线播放| 3atv国产精品视频| 99久久久国产精品免费无卡顿| 亚洲一区二区三区国产精品无码| 99re6在线精品免费观看| 国产精品嫩草影院久久| 国产精品三级在线观看| 最新69国产成人精品免费视频动漫| 99久久精品免费精品国产| 久久国产精品久久久久久| 国产成人vr精品a视频| 日韩欧国产精品一区综合无码| 久久国产精品-久久精品|