編輯:Android開發教程
在慢慢深入接觸android開發的過程中,我越來越發現android中(至少應用曾的開發)用到了很多回調的思想。比如activity的生命周期,fragment的生命周期,皆是回調函數實現的,android中的事件處理機制其一就是回調,線程方面的異步任務、loader、hanlder等都是基於回調的,等等。
可見android的其一根本思想就是回調,需要你來參與時,回調用相關的回調方法,你來填充。
可以說回調的思想浸潤與android設計的方方面面,android開發中幾乎帶有on的方法都是回調方法。作為一名致力於深入學習移動開發的菜鳥,深入理解回調就顯得非常必要了。
回調是不得以而為之的設計策略,想象一種系統實現:在一個下載系統中有一個文件下載模塊和一個下載文件當前進度顯示模塊,系統要求實時的顯示文件的下載進度,想想很簡單,在面向對象的世界裡無非是實現兩個類而已。但是問題恰恰出在這裡,顯示模塊如何驅動下載進度條?顯示模塊不知道也不應該知道下載模塊所知道的文件下載進度(面向對象設計的封裝性,模塊間要解耦,模塊內要內聚),文件下載進度是只有下載模塊才知道的事情,解決方案很簡單給下載模塊傳遞一個函數指針作為回調函數驅動顯示模塊的顯示進度。
在面向對象的世界中這樣的例子還真不少,造成這樣的問題的根源,相信大家已經從上面的敘述中體會到了,就是面向對象的程序設計思想,就是設計模式中要求的模塊獨立性,高內聚低耦合等特性。
封裝變化的編程策略給編程人員第一位的指導思想就是面向接口編程,即設計模式中提到的面向虛擬編程而不是面向實現。這樣的編程思想極大地革新了編程世界,可以說沒有這一原則就沒有面向對象的程序設計,這一原則給程序設計一種指導思想:即如何更高的將現實模型映射成程序模型。這樣的設計思想在極大地催生高度獨立性模塊的同時削弱了模塊間的協作性,也就是耦合性,它使得模塊間更多的從事著單向的調用工作,一個模塊需要某種服務就去找另一個模塊,這使得程序呈現出層次性,高層通過接口調用底層,底層提供服務。但是現實世界中嚴格遵循現層次特性的系統是很少見的,絕對的MVC是不存在的,因為更多的模塊要求通並協作,可見沒有耦合就沒有協作沒有好的調用關系,耦合真的不是錯。
既然我們需要模塊間的協作,同時我們又厭惡的摒棄模塊間你中有我我中有你的暧昧關系那如何生成系統呢,答案是函數指針(不一定是函數指針)也就是使用回調的方式。如果一個對象關心另一個對象的狀態變化那麼給狀態的變化注冊回調函數讓它通知你這類狀態的改變,這樣在封裝了模塊變化的同時實現了模塊間的協作關系另辟獨徑的給對象解耦。
你餓了,想吃飯,就一會去問你媽一聲”開飯沒有啊?”這就是正常函數調用.
但是今天你媽包餃子,花的時間比較長,你跑啊跑啊,就煩了.於是你給你媽說,我先出去玩會,開飯的時候打我手機.等過了一陣,你媽給你打電話說”開飯啦,快回來吃飯吧!”
其中,你告訴你媽打手機找你,就是個你把回調函數句柄保存到你媽的動作.你媽打電話叫你,就是個回調過程.
理解方式1:一般寫程序是你調用系統的API,這個過程叫Call。如果把關系反過來,你寫一個函數,讓系統調用你的函數,那就是回調(CallBack)了,那個被系統調用的函數就是回調函數。放到android中,我們一般是調用framwork定義的api,但是如果我們寫了一個方法,由framwork來調用,這個方法就是回調函數。
理解方式2:所謂回調函數,其運行方式是,“你不用調用我,等著我來調用你”。回調的意思是在你執行某個語句後成功了,再執行你傳遞進來的function,在做異步處理的時候特別有用。
理解方式3:歸程序本質,刨除那些面向對象的概念,回調函數就是一個通過函數指針調用的函數。就是用函數指針做參數。那個函數指針就是回調函數。
URL:http://www.bianceng.cn/OS/extra/201608/50348.htm
回調是編程層面的設計模式,不是基於語言的。在C/C++中,要用回調函數,被調函數需要告訴調用者自己的指針地址,但在JAVA中沒有指針,怎麼辦?我們可以通過接口(interface)來實現定義回調函數。在.Net的世界裡Delegate ==Callback。
JAVA的CALLBACK通過接口來實現。
例:
1.class A,class B
2.class A實現接口operate
3.class B擁有一個參數為operate接口類型的函數test(operate o)
4.class A運行時調用class B中test函數,以自身傳入參數
5.class B已取得A,就可以隨時回調A所實現的operate接口中的方法
自己以以前寫的一篇博客為案例做以分析:
http://blog.csdn.net/a910626/article/details/45767079
回調圖示:
回調函數主要用於一些比較費時的操作,或響應不知道何時將會發生的事件,場合異步結合(異步其實就是重開一個線程)。
當兩個對象之間需要進行一些協同操作時,常使用回調函數,比如一個對象想獲得另一個對象內部的某些數據。
回調函數使得程序設計更加靈活。
實現模塊獨立性,將實現者和調用者分離,符合面對對象高內聚低耦合的設計思想。
代碼的易讀性不好。
這個例子單獨運行時(從Launcher啟動),這時接受到的Intent不含ACTION_SEARCH,和一個普通的Activity沒有什麼兩樣。在例(36)時,它是作為查
構建移動應用程序和構建 Web 應用程序一樣,要時刻牢記最終目標(和用戶)。始終了解您的應用程序可 以給用戶帶來哪些利益。您的應用程序將顯示哪些類型的信息,擁有哪些功能
版本: Android Studio 0.5.1因為Android的一些特定功能需要高版本的支持, 當最小SDK版本(minSdkVersion)過低時, 會出現報錯,
上篇文章已經對Web Service及其相關知識進行了介紹(Android開發之WebService介紹 ),相信有的朋友 已經忍耐不住想試試在Android應用中調用W