亚洲乱码卡一卡二卡三永久-亚洲乱码一二三四区-亚洲乱码一区二区三区在线观看-亚洲伦理一区-成人在色线视频在线观看免费大全-成人在线91

 

android handler消息機(jī)制

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

轉(zhuǎn)載

 

 

 

標(biāo)簽:

雜談

 

 

 

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


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

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


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


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


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


三、應(yīng)用實(shí)例
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,并為這個(gè)handler實(shí)現(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();//取得當(dāng)前線程里的looper

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

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

                    mHandler.removeMessages(0);

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

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

                    mHandler.sendMessage(m);//發(fā)送消息:系統(tǒng)會(huì)自動(dò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的方法是可以派生一個(gè)Handler的子類,在子類中實(shí)現(xiàn)handleMessage方法。
1、定義Handler的派生類,并在子類中實(shí)現(xiàn)handleMessage方法。
2、在主線程的類中,定義該子類的對象。
3、在子線程中,調(diào)用主線程中的對象。


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

 

 


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

 

穩(wěn)定

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

貼心

項(xiàng)目群及時(shí)溝通

專業(yè)

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

快速

MVP模式小步快跑

承諾

我們選擇聲譽(yù)

堅(jiān)持

10年專注高端品質(zhì)開發(fā)
  • 返回頂部
主站蜘蛛池模板: 在线不卡日韩 | 欧美x×x| 欧美日韩视频免费播放 | 日韩一区二区免费视频 | 欧美视频久久 | 99艾草视频在线播放 | 精品一区二区三区影院在线午夜 | 国产精品天干天干 | 视频一区二区在线播放 | 欧美激情a∨在线视频播放 欧美激情二区 | 欧美精品在线观看视频 | 亚洲一区在线免费观看 | 99国内精品 | 一级a毛片免费观看 | 在线综合+亚洲+欧美中文字幕 | 免费永久观看美女视频网站网址 | 国产欧美日韩三级 | 亚洲国产高清一区二区三区 | 五月天激情婷婷大综合 | 成人午夜免费视频毛片 | 韩日免费视频 | www.亚洲第一| 色婷婷中文网 | 亚洲综合久久伊人热 | 黄色片一级视频 | 成人合集大片bd高清在线观看 | 黄色网址免费在线观看 | 一级做a爰片鸭王 | 欧美黄网站免费观看 | 亚洲欧美日韩中文高清一 | 日本欧美中文 | 天天操夜夜欢 | 99久久精品免费 | 欧美精品成人一区二区视频一 | 夜夜爽一区二区三区精品 | 亚洲啊v在线 | 免费看男人靠女人靠到爽 | 最近韩国日本免费观看mv免费版 | 亚洲精品国产成人中文 | 久久久久国产精品免费看 | 日本不卡视频在线播放 |