淺析android系統設計中的回調思想

來源:互聯網
上載者:User

淺析android系統設計中的回調思想
為何寫作本文

??在慢慢深入接觸android開發的過程中,我越來越發現android中(至少應用曾的開發)用到了很多回調的思想。比如activity的生命週期,fragment的生命週期,皆是回呼函數實現的,android中的事件處理機制其一就是回調,線程方面的非同步任務、loader、hanlder等都是基於回調的,等等。

??可見android的其一根本思想就是回調,需要你來參與時,回調用相關的回調方法,你來填充。

??可以說回調的思想浸潤與android設計的方方面面,android開發中幾乎帶有on的方法都是回調方法。作為一名致力於深入學習移動開發的菜鳥,深入理解回調就顯得非常必要了。

為何要引入回調

??回調是不得以而為之的設計策略,想象一種系統實現:在一個下載系統中有一個檔案下載模組和一個下載檔案當前進度顯示模組,系統要求即時的顯示檔案的下載進度,想想很簡單,在物件導向的世界裡無非是實現兩個類而已。但是問題恰恰出在這裡,顯示模組如何驅動下載進度條?顯示模組不知道也不應該知道下載模組所知道的檔案下載進度(物件導向設計的封裝性,模組間要解耦,模組內要內聚),檔案下載進度是只有下載模組才知道的事情,解決方案很簡單給下載模組傳遞一個函數指標作為回呼函數驅動顯示模組的顯示進度。

??在物件導向的世界中這樣的例子還真不少,造成這樣的問題的根源,相信大家已經從上面的敘述中體會到了,就是物件導向的程式設計思想,就是設計模式中要求的模組獨立性,高內聚低耦合等特性。

??封裝變化的編程策略給編程人員第一位的指導思想就是面向介面編程,即設計模式中提到的面向虛擬編程而不是面向實現。這樣的編程思想極大地革新了編程世界,可以說沒有這一原則就沒有物件導向的程式設計,這一原則給程式設計一種指導思想:即如何更高的將現實模型映射成程式模型。這樣的設計思想在極大地催生高度獨立性模組的同時削弱了模組間的協作性,也就是耦合性,它使得模組間更多的從事著單向的調用工作,一個模組需要某種服務就去找另一個模組,這使得程式呈現出層次性,高層通過介面調用底層,底層提供服務。但是現實世界中嚴格遵循現層次特性的系統是很少見的,絕對的MVC是不存在的,因為更多的模組要求通並協作,可見沒有耦合就沒有協作沒有好的調用關係,耦合真的不是錯。

??既然我們需要模組間的協作,同時我們又厭惡的摒棄模組間你中有我我中有你的曖昧關係那如何產生系統呢,答案是函數指標(不一定是函數指標)也就是使用回調的方式。如果一個對象關心另一個對象的狀態變化那麼給狀態的變化註冊回呼函數讓它通知你這類狀態的改變,這樣在封裝了模組變化的同時實現了模組間的協作關係另闢獨徑的給對象解耦。

回調的通俗理解

??你餓了,想吃飯,就一會去問你媽一聲”開飯沒有啊?”這就是正常函數調用.

??但是今天你媽包餃子,花的時間比較長,你跑啊跑啊,就煩了.於是你給你媽說,我先出去玩會,開飯的時候打我手機.等過了一陣,你媽給你打電話說”開飯啦,快回來吃飯吧!”

??其中,你告訴你媽打手機找你,就是個你把回呼函數控制代碼儲存到你媽的動作.你媽打電話叫你,就是個回調過程.

回調的詳細解釋

理解方式1:一般寫程式是你調用系統的API,這個過程叫Call。如果把關係反過來,你寫一個函數,讓系統調用你的函數,那就是回調(CallBack)了,那個被系統調用的函數就是回呼函數。放到android中,我們一般是調用framwork定義的api,但是如果我們寫了一個方法,由framwork來調用,這個方法就是回呼函數。

理解方式2:所謂回呼函數,其運行方式是,“你不用調用我,等著我來調用你”。回調的意思是在你執行某個語句後成功了,再執行你傳遞進來的function,在做非同步處理的時候特別有用。

理解方式3:歸程式本質,刨除那些物件導向的概念,回呼函數就是一個通過函數指標調用的函數。就是用函數指標做參數。那個函數指標就是回呼函數。

??回調是編程層面的設計模式,不是基於語言的。在C/C++中,要用回呼函數,被調函數需要告訴調用者自己的指標地址,但在JAVA中沒有指標,怎麼辦?我們可以通過介面(interface)來實現定義回呼函數。在.Net的世界裡Delegate ==Callback。

在android中怎麼使用回調呢

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

回調圖示:

回調用在哪裡

回呼函數主要用於一些比較費時的操作,或響應不知道何時將會發生的事件,場合非同步結合(非同步其實就是重開一個線程)。

當兩個對象之間需要進行一些協同操作時,常使用回呼函數,比如一個對象想獲得另一個對象內部的某些資料。

回調的優點

回呼函數使得程式設計更加靈活。

實現模組獨立性,將實現者和調用者分離,符合面對對象高內聚低耦合的設計思想。

回調的缺點

代碼的易讀性不好。

聯繫我們

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