欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解Android之接口回調(diào)機(jī)制

 更新時(shí)間:2016年10月27日 16:47:34   作者:冷的鋒刃  
本篇文章主要介紹了Android之接口回調(diào)機(jī)制,在開發(fā)中經(jīng)常會(huì)用到,具有一定的學(xué)習(xí)價(jià)值,有需要的可以來了解一下。

剛開始學(xué)對(duì)于這個(gè)機(jī)制理解不夠深刻,現(xiàn)在重新整理下思路。開發(fā)中,接口回調(diào)是我們經(jīng)常用到的。

接口回調(diào)的意思即,注冊(cè)之后并不立馬執(zhí)行,而在某個(gè)時(shí)機(jī)觸發(fā)執(zhí)行。

首先解決啥是回調(diào):

舉個(gè)例子:某天,我打電話向你請(qǐng)教問題,當(dāng)然是個(gè)難題,你一時(shí)想不出解決方法,我又不能拿著電話在那里傻等,于是我們約定:等你想出辦法后打手機(jī)通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機(jī)響了,你興高采烈的說問題已經(jīng)搞定,應(yīng)該如此這般處理。

 

C不會(huì)自己調(diào)用b,C提供b的目的就是讓S來調(diào)用它,而且C不得不提供。S并不知道C提供的b是什么,因此S會(huì)約定b的接口規(guī)范(函數(shù)原型),然后由C提前通過S的一個(gè)函數(shù)r告訴S自己將要使用b函數(shù)(即注冊(cè))。r為注冊(cè)函數(shù)。

簡(jiǎn)單來說:回調(diào)函數(shù)就是預(yù)留給系統(tǒng)調(diào)用的函數(shù),而且我們往往知道該函數(shù)被調(diào)用的時(shí)機(jī),那我們繼續(xù)完善下上面的那幅圖。

看著這幅圖,其實(shí)我們回想一下,會(huì)發(fā)現(xiàn),生活中到處都有回調(diào)這種思想存在。軟件的很多思想其實(shí)只是我們實(shí)際生活中思維方式的一種轉(zhuǎn)化。

我們平時(shí)考試答題的第一件事是干嘛?沒錯(cuò),是寫上學(xué)號(hào)和姓名。這里注意了,我們填寫學(xué)號(hào)和姓名不是給自己看的(即該方法不是給自己調(diào)用的),而是給老師登記分?jǐn)?shù)時(shí)看的(預(yù)留給系統(tǒng)將來調(diào)用),這其實(shí)就是一個(gè)回調(diào)的應(yīng)用。老師提供接口(輸入姓名,學(xué)號(hào)規(guī)則),我們利用接口注冊(cè)。

看到上面的小示例,大家對(duì)回調(diào)就有了一些了解了,我們?cè)倩氐轿恼聞傞_始的例子。

那個(gè)例子說明了“異步+回調(diào)”的編程模式。其中,你后來打手機(jī)告訴我結(jié)果便是一個(gè)“回調(diào)”過程;我的手機(jī)號(hào)碼必須在以前告訴你,這便是注冊(cè)回調(diào)函數(shù);我的手機(jī)號(hào)碼應(yīng)該有效并且手機(jī)能夠接收到你的呼叫,這是回調(diào)函數(shù)必須符合接口規(guī)范。

我們已經(jīng)大概知道了回調(diào)的基本流程,下面,來看看Android中回調(diào)的基本使用。

場(chǎng)景一:

Button button = (Button)this.findViewById(R.id.button);  
button.setOnClickListener(newButton.OnClickListener() {  
  //回調(diào)函數(shù)  
  @override  
  publicvoidonClick(View v) {  
   buttonTextView.setText("按鈕被點(diǎn)擊了");  
  }  
});  

上面的代碼給按鈕加了一個(gè)事件監(jiān)聽器,這其實(shí)就是“回調(diào)”最常見的應(yīng)用場(chǎng)景之一。我們自己不會(huì)顯式地去調(diào)用onClick方法。用戶觸發(fā)了該按鈕的點(diǎn)擊事件后,它會(huì)由Android系統(tǒng)來自動(dòng)調(diào)用。

場(chǎng)景二:

@Override  
publicvoidonCreate(BundlesaveInstanceState) {  
  super.onCreate(saveInstanceState);  
  // You code...  
}  
@Override  
publicvoidonResume() {  
  super.onResume();  
  // You code...  
}  

Activity的整個(gè)生命周期基本上都說回調(diào)函數(shù)在發(fā)揮作用。

看了兩個(gè)我們經(jīng)常使用的回調(diào)方式,我們先來總結(jié)下android利用回調(diào)的基本方法。其實(shí),只是把我們的那張圖翻譯了下。

--你類--

package lin.callback.test; 
  
public class You implements Runnable{ 
  
    
  private String who; 
   private ContactInterface callBack;  
   public You() { 
      // TODO Auto-generated constructor stub 
   } 
    
  //調(diào)用此方法就表示有人聯(lián)系你了,注冊(cè)到你這來 
   public void setCallBack(String who,String question,ContactInterface callBack) { 
     this.who = who;   
     System.out.println("你說:當(dāng)前聯(lián)系到我的人是"+who+",問題是"+question); 
     this.callBack =callBack; 
   } 
     
   public void handleThings(){ 
     //假如你現(xiàn)在正在想問題的答案,需要一點(diǎn)時(shí)間 
     for(int i=0;i<100000;i++){  
        if(i == 0){ 
          System.out.println("你正在思考問題....."); 
        } 
     } 
      
     String answer = "答案是A"; 
     //想到問題的辦法了 
     System.out.println("你說:想到答案了,準(zhǔn)備打回去給"+who+"告訴他答案"); 
     callBack.callBackByTel(answer); 
   } 
  
  /* (non-Javadoc) 
   * @see java.lang.Runnable#run() 
   */ 
  @Override 
  public void run() { 
    try { 
      Thread.sleep(1000); 
      handleThings(); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  }  
} 

--我類--

public class Me { 
  
   public static void main(String[] args){  
      
     Me me = new Me(); 
     me.hasQuestion(); 
      
   } 
    
   private void hasQuestion(){ 
     //現(xiàn)在有問題想不出來答案,想去問你 
     You you = new You(); 
     you.setCallBack("蝸牛", "某道題答案是什么?", new ContactInterface() { 
        
      @Override 
      public void callBackByTel(String answer) { 
        System.out.println("我說:嗯,好的,我收到答案了:"+answer+",謝謝"); 
          
      } 
    }); 
    //你接到電話,起床開始思考問題 
    new Thread(you).start(); 
   } 
} 

--接口類(規(guī)范)--

public interface ContactInterface { 
    
  public void callBackByTel(String answer); 
    
} 

驗(yàn)證結(jié)果:

你說:當(dāng)前聯(lián)系到我的人是蝸牛,問題是某道題答案是什么?
你正在思考問題
你說:想到問題了,準(zhǔn)備打回去給蝸牛告訴他答案
我說:嗯,好的,我收到答案了:答案是A,謝謝

對(duì)回調(diào)的深入思考:

程序的本質(zhì)就是代碼跳轉(zhuǎn),不管同步異步反射接口虛函數(shù),本質(zhì)上都是函數(shù)調(diào)用。函數(shù)我們要調(diào)用它,就需要它的指針,不同語言通過不同的方式來得到這個(gè)指針。而我們定義的接口其實(shí)就是一個(gè)函數(shù)指針,那么那個(gè)注冊(cè)過程,其實(shí)就是相當(dāng)于對(duì)那個(gè)函數(shù)指針賦值。通過這個(gè)函數(shù)指針來調(diào)用我們定義的自實(shí)現(xiàn)函數(shù)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論