深入理解Android之介面回調機制_Android

來源:互聯網
上載者:User

剛開始學對於這個機制理解不夠深刻,現在重新整理下思路。開發中,介面回調是我們經常用到的。

介面回調的意思即,註冊之後並不立馬執行,而在某個時機觸發執行。

首先解決啥是回調:

舉個例子:某天,我打電話向你請教問題,當然是個難題,你一時想不出解決方案,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,My Phone響了,你興高采烈的說問題已經搞定,應該如此這般處理。

 

C不會自己調用b,C提供b的目的就是讓S來調用它,而且C不得不提供。S並不知道C提供的b是什麼,因此S會約定b的介面規範(函數原型),然後由C提前通過S的一個函數r告訴S自己將要使用b函數(即註冊)。r為註冊函數。

簡單來說:回呼函數就是預留給系統調用的函數,而且我們往往知道該函數被調用的時機,那我們繼續完善下上面的那幅圖。

看著這幅圖,其實我們回想一下,會發現,生活中到處都有回調這種思想存在。軟體的很多思想其實只是我們實際生活中思維方式的一種轉化。

我們平時考試答題的第一件事是幹嘛?沒錯,是寫上學號和姓名。這裡注意了,我們填寫學號和姓名不是給自己看的(即該方法不是給自己調用的),而是給老師登記分數時看的(預留給系統將來調用),這其實就是一個回調的應用。老師提供介面(輸入姓名,學號規則),我們利用介面註冊。

看到上面的小樣本,大家對回調就有了一些瞭解了,我們再回到文章剛開始的例子。

那個例子說明了“非同步+回調”的編程模式。其中,你後來打手機告訴我結果便是一個“回調”過程;My Phone號碼必須在以前告訴你,這便是註冊回呼函數;My Phone號碼應該有效並且手機能夠接收到你的呼叫,這是回呼函數必須符合介面規範。

我們已經大概知道了回調的基本流程,下面,來看看Android中回調的基本使用。

情境一:

Button button = (Button)this.findViewById(R.id.button);  button.setOnClickListener(newButton.OnClickListener() {    //回呼函數    @override    publicvoidonClick(View v) {     buttonTextView.setText("按鈕被點擊了");    }  });  

上面的代碼給按鈕加了一個事件監聽器,這其實就是“回調”最常見的應用情境之一。我們自己不會顯式地去調用onClick方法。使用者觸發了該按鈕的點擊事件後,它會由Android系統來自動調用。

情境二:

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

Activity的整個生命週期基本上都說回呼函數在發揮作用。

看了兩個我們經常使用的回調方式,我們先來總結下android利用回調的基本方法。其實,只是把我們的那張圖翻譯了下。

--你類--

package lin.callback.test;   public class You implements Runnable{         private String who;    private ContactInterface callBack;     public You() {       // TODO Auto-generated constructor stub    }       //調用此方法就表示有人聯絡你了,註冊到你這來    public void setCallBack(String who,String question,ContactInterface callBack) {      this.who = who;        System.out.println("你說:當前聯絡到我的人是"+who+",問題是"+question);      this.callBack =callBack;    }         public void handleThings(){      //假如你現在正在想問題的答案,需要一點時間      for(int i=0;i<100000;i++){          if(i == 0){           System.out.println("你正在思考問題.....");         }      }            String answer = "答案是A";      //想到問題的辦法了      System.out.println("你說:想到答案了,準備打回去給"+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(){      //現在有問題想不出來答案,想去問你      You you = new You();      you.setCallBack("蝸牛", "某道題答案是什嗎?", new ContactInterface() {               @Override       public void callBackByTel(String answer) {         System.out.println("我說:嗯,好的,我收到答案了:"+answer+",謝謝");                 }     });     //你接到電話,起床開始思考問題     new Thread(you).start();    } } 

--介面類(規範)--

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

驗證結果:

你說:當前聯絡到我的人是蝸牛,問題是某道題答案是什嗎?
你正在思考問題
你說:想到問題了,準備打回去給蝸牛告訴他答案
我說:嗯,好的,我收到答案了:答案是A,謝謝

對回調的深入思考:

程式的本質就是代碼跳轉,不管同步非同步反射介面虛函數,本質上都是函數調用。函數我們要調用它,就需要它的指標,不同語言通過不同的方式來得到這個指標。而我們定義的介面其實就是一個函數指標,那麼那個註冊過程,其實就是相當於對那個函數指標賦值。通過這個函數指標來調用我們定義的自實現函數。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.