編輯:關於Android編程
剛開始學對於這個機制理解不夠深刻,現在重新整理下思路。開發中,接口回調是我們經常用到的。
接口回調的意思即,注冊之後並不立馬執行,而在某個時機觸發執行。
首先解決啥是回調:
舉個例子:某天,我打電話向你請教問題,當然是個難題,你一時想不出解決方法,我又不能拿著電話在那裡傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該如此這般處理。
C不會自己調用b,C提供b的目的就是讓S來調用它,而且C不得不提供。S並不知道C提供的b是什麼,因此S會約定b的接口規范(函數原型),然後由C提前通過S的一個函數r告訴S自己將要使用b函數(即注冊)。r為注冊函數。
簡單來說:回調函數就是預留給系統調用的函數,而且我們往往知道該函數被調用的時機,那我們繼續完善下上面的那幅圖。
看著這幅圖,其實我們回想一下,會發現,生活中到處都有回調這種思想存在。軟件的很多思想其實只是我們實際生活中思維方式的一種轉化。
我們平時考試答題的第一件事是干嘛?沒錯,是寫上學號和姓名。這裡注意了,我們填寫學號和姓名不是給自己看的(即該方法不是給自己調用的),而是給老師登記分數時看的(預留給系統將來調用),這其實就是一個回調的應用。老師提供接口(輸入姓名,學號規則),我們利用接口注冊。
看到上面的小示例,大家對回調就有了一些了解了,我們再回到文章剛開始的例子。
那個例子說明了“異步+回調”的編程模式。其中,你後來打手機告訴我結果便是一個“回調”過程;我的手機號碼必須在以前告訴你,這便是注冊回調函數;我的手機號碼應該有效並且手機能夠接收到你的呼叫,這是回調函數必須符合接口規范。
我們已經大概知道了回調的基本流程,下面,來看看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,謝謝
對回調的深入思考:
程序的本質就是代碼跳轉,不管同步異步反射接口虛函數,本質上都是函數調用。函數我們要調用它,就需要它的指針,不同語言通過不同的方式來得到這個指針。而我們定義的接口其實就是一個函數指針,那麼那個注冊過程,其實就是相當於對那個函數指針賦值。通過這個函數指針來調用我們定義的自實現函數。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
這個實例可以幫助我們學習旋轉動畫和計時器這兩個知識點,廢話不多說,上主程序: package com.bear.lotterywheel; import java.u
Android快速入門 1. 搭建開發環境>解壓壓縮文件,得到:①Android SDK (類似於JDK)② Eclipse ③ADT>配置兩個pat
看過很多開源代碼效果,發現裡面的代碼很多地方都用到這函數,於是想花些時間研究下這個,我現在寫博客一般不可能一下子就寫完,因為我也要查資料,寫代碼去驗證其效果,而且還要找下
1、Service的種類按運行地點分類: 類別 區別 優點 缺點 應用