版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、248如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_06249心懷 EIT 造形看框架世界7.17.27.37.47.5看出美麗的 EIT 造形主要思路:從找到 EIT 造形的重復(fù)組合EIT 造形組合的范例:多線程應(yīng)用結(jié)語250如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_067.1 看出美麗的 EIT 造形當(dāng)心懷(Archimedes)幾合學(xué)里的橢圓造形去系星球的心懷楓葉運行時,就會發(fā)現(xiàn)其單一造形所創(chuàng)造出來的整體之美。同樣地,當(dāng)單純造形去楓葉樹林時,也立即會發(fā)現(xiàn)其單一造形所創(chuàng)造出來的整體之美。以此類推,當(dāng)心懷 EIT 單純造形去Android 系統(tǒng)框架
2、時,也會發(fā)現(xiàn)其單一造形所創(chuàng)造出來的整體之美。7.1.1 復(fù)習(xí)造形(Form)概念面第 5,介紹過了 EIT 造形的來源。茲簡單復(fù)下。自然界的造形主要來自信息的有限性( Information Limiions)。由于這項限制,一個生物形體的造成,是出自一個概括性的計劃:單純的造形。隨著生物的成長、與環(huán)境的交互信息愈多,逐漸在細節(jié)上修修補補,就發(fā)展出不同的內(nèi)涵。然后,基于單純的造形,不斷進行重復(fù)地組合。例如,漂亮的楓葉林,就是合乎單純造形、不同內(nèi)涵、重復(fù)組合三項特性。許多造形相同(且不同細節(jié))的楓葉,組合出一遍美麗的樹林。如下圖:圖 7-1、美不勝收的楓葉造形251再如人們掌的造形也都極為相似,
3、其細節(jié)紋路也各不相同,也滿足上述三項特性。此外,在工業(yè)設(shè)計品中,你常常可以發(fā)現(xiàn)其杰作具有其特色:簡單造形、內(nèi)涵不同、無限重復(fù)。貨柜(集裝箱)就是典型的單純造形,它兼具了簡單造形、內(nèi)涵不同、無限重復(fù)三項特質(zhì)。更重要的是:它帶來無比巨大的商業(yè)潛力和暴利商機。只要擁有上述三項特質(zhì)的工業(yè)設(shè)計品,都會具有和巨大商業(yè)潛能。在文學(xué)詩詞上,例如唐詩七言絕句的造形是:4 行 7 字和平仄韻律?;诖嗽煨?,人人都能輕易加入創(chuàng)作,促成鼎盛詩風(fēng)。在建筑上,四合院造形也是。7.1.2造形的組成元素造形概念有兩層作用:1)規(guī)范元素組合規(guī)律,讓人們?nèi)菀捉M合出間模塊。2)規(guī)范中間模塊組合規(guī)律;讓人們?nèi)菀捉M合出系統(tǒng)。例如,玫瑰
4、花就是一個造形,規(guī)范了花瓣、花蕊、花襯葉等有限元素的組合規(guī)律。同時它無限重復(fù)也大大影響(和簡化)了整體樹系統(tǒng)的組合規(guī)律。這項造物法則,了掌握自然界復(fù)雜多變的能力,唯有熟諳此道,才能創(chuàng)造架構(gòu)和產(chǎn)品的未來性。于是,樹是一個單一造形(Form),含葉、枝、干、根等共同元素種類,也有元間的簡單組合規(guī)律。然后依循將樹這種造形依循簡單規(guī)律,無限重復(fù)和組合就成為林。再從系有九大行星的運行軌跡而觀之,其單一造形就是橢圓形。每個造形都含有兩個元素:和行星。如果系本身不是一位出色的幾何學(xué)家,那么一定有一位杰出的幾何學(xué)家創(chuàng)造了系。在上也是把復(fù)雜多變的內(nèi)涵封裝于一個簡單的造形里。例如,面象的類別(Class),其只有
5、兩個元素:函數(shù)(Function)和數(shù)據(jù)項(Data Item)?;谶@簡單造形,人們掌握能力增強了,不再畏懼了,就敢大膽去嘗試各項組的應(yīng)用(APlications)。為形形252如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_067.1.3EIT 造形的組成元素一般而言,造形的組成元素種類,大多為 2 或 3 種,并且有簡單的元素組成規(guī)律。例如:系的行星運行軌跡,呈現(xiàn)單純的橢圓造形。每個造形都只含有兩種元素:和行星。架構(gòu),其造形也只有三種元素:行政、和司法。的類別,其造形也只有兩種元素:函數(shù)和數(shù)據(jù)項。XML 的造形也只有兩種元素:Tag 和 Content。物理的原子,其造
6、形只有三種元素:質(zhì)子、中子和電子。等等。前面第 5.3 節(jié)里,介紹過本書的概念:框架的 EIT 造形。這 EIT 造形也是基于固定而有限的元素種類(如引擎、接口、輪胎三種元素),加上簡單的組合規(guī)律(如引擎透過接口來呼叫輪胎),也形成了單純造形。雖然造形的輪廓相同,組成元素種類也相同,然而其形不同的內(nèi)涵。元素,以及元素的不同組合,覆予各個造在物理學(xué)上的原子造形也是如此,氫原子(H)和氧原子(O)兩者的都是原子造形。這兩個造形輪廓相同(都是原子造形),但是內(nèi)涵不同。圖 7-2、原子造形與 EIT 造形的對比253從 EIT 造形與原子造形的對比,很容易理解到造形元間,有其組合與互動的韻律(或規(guī)律)
7、?;诠潭ǘ邢薜脑胤N類(如質(zhì)子、中子、電子三種元素),加上簡單的組合規(guī)律(如電子圍繞質(zhì)子和中子),形成所謂的單純造形。同樣地,EIT 造形也是基于固定而有限的元素種類(如引擎、接口、輪胎三種元素),加上簡單的組合規(guī)律(如引擎透過接口來呼叫輪胎),也形成了單純的造形。7.2主要思路:從找到前面第 3,介紹過回 Call(Callback)接口,它就是大家已經(jīng)熟悉的反向呼叫(IoC)接口,也就是本書所稱的接口,它扮演框架基類呼叫 AP子類的主要通道。但要留意的是,所謂 Callback 或反向,是基于 AP 開發(fā)者的角度而言的;意謂著它是 AP 子類正向呼叫框架基類之后,由框架基類回 Call
8、到 AP 子類的管道。由于大多數(shù)人都有 AP 開發(fā)的經(jīng)驗,常?;诳蚣艿慕涌趤碜珜?AP 子類;本章就以 Android 框架為范圍,帶領(lǐng)你從熟悉的框架接口來尋找其背后的引擎角色。一旦找到優(yōu)關(guān)的引擎類別,就看到完整的 EIT 造形了。Android 框架就是由許許多多的 EIT 造形所組合出來的。除了尋找 EIT 造形之外,本章也詳細介紹如何將 EIT 造形組為整體框架(如 Android 框架)。7.2.1由于以 SurfaceHolder.Callback 接口為例接口是框架的必要元素,所以可以從這種接口,來尋找與它攸關(guān)的引擎角色。例如,你看到 SurfaceHolder.Callback
9、 接口時,就很容易聯(lián)想到 SurfaceView 正扮演它的引擎角色。254如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_06圖 7-3、從 SurfaceHolder.Callback 接口找到它的引擎這也是一個常用到的 Android 框架機制,只要想繪制 3D 圖形,或MP4等影片,都會用到它。只是許多人都會用它,卻不曾展現(xiàn)溫柔的心境,欣賞一下它的美麗身影,享受 Android 框架之美,實在可惜!值得注意的是,引擎與 Callback 接口之間是N:N關(guān)系。也就是說,除了 SurfaceView(即引擎)之外;必要的時候,框架設(shè)計者可以設(shè)計其它引擎類別來使用 Sur
10、faceHolder.Callback 接口。同樣地, SurfaceView 也 不 限 制只使用 SurfaceHolder.Callback 接口;必要的時候,框架設(shè)計者可以替 SurfaceView 設(shè)計其它接口類別。上圖呈現(xiàn)了 Android 里常用的 SurfaceView 小框架,基于這個框架能反向呼叫 AP 子類,也可以讓 AP 子類正向呼叫框架基類。如下圖:255圖 7-4、SurfaceView 框架的正向與反向溝通于此圖里, SurfaceHolder.Callback 扮演 的角色, SurfaceView( 含SurfaceHolder)扮演的角色,而 myRende
11、rer 扮演的角色。SurfaceView 引擎透過 Callback 接口,呼叫了 myRenderer 的 surfaceCreated()等函數(shù)。值得留意的是,從“Callback”字眼上,很容易引導(dǎo)到AP 本位的觀點。此觀點下,你會認為上圖的 AP 子類(即 myRenderer)是指揮者(der),它先呼叫 SurfaceHolder 的 lockCanvas()等函數(shù),才SurfaceView 基類的反向呼叫(Callback)到接口的 surfaceCreated()函數(shù)。這樣的觀點并不適合框架設(shè)計者,所以你需要換個新觀點:框架基類是指揮者。例如上圖里:, SurfaceView
12、 對象向 Android 的 WindowManagerService( 和首先 SurfaceFlinger)系統(tǒng)服務(wù)取的一個 Surface,將它包裝于 SurfaceView 里的SurfaceHolder 對象里。然后,透過 Callback 接口來呼叫 myRenderer 子類里的 surfaceCreated()函數(shù),此時將該 SurfaceHolder 對象(的指針或參考)傳遞給 myRenderer 的對象。256如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_06myRenderer 子類的對象才依循 SurfaceHolder 的指標(biāo)而呼叫到 Surfa
13、ceHolder的 lockCanvas()等函數(shù)。以上看出了 Android 框架里的主 要 EIT 造形,就是: SurfaceView, SurfaceHolder.Callback, myRenderer造形。如果只想呈現(xiàn)出框架部分(即和元素),可表示為:SurfaceView, SurfaceHolder.Callback, 。7.2.2以 Runnable 接口為例前面提過了,Android 應(yīng)用框架就如同一座楓葉林,而上圖的造形只是其中的一片漂亮楓葉而已。接著,請看另一片楓葉。Android 采取 Java 的 Thread 機制,來協(xié)助建立多線程的執(zhí)行環(huán)境。在 Java 里,大
14、家已經(jīng)撰寫一個類別來支持Runnable 接口,再搭配 Thread 基類就能順利誕生一個新線程來執(zhí)行該類別里的run()函數(shù)了。這個 Thread 基類就扮演引擎角色,如下圖所示:圖 7-5、框架設(shè)計師眼中的 Thread 機制Runnable 接口的 Thread 框架的基本要素;Runnable 接口搭配到 Thread 基類,就形成了 Thread 框架?;谶@個接口,Thread 基類就能誕生一個新線程,并透過 Runnable 接口去呼叫子類別的 run()函數(shù)。如下圖所示:257圖 7-6、Thread 框架的正反向溝通情形這個 Thread 類別扮演引擎角色,Runnable
15、是接口,而 Task 則是輪胎。在 Thread 的 start()函數(shù)會誕生一個小線程,反向呼叫 Task 的 run()函數(shù);必要時, Task 會正向呼叫 Thread 的 currentThread()等函數(shù)。換句話說,Runnable 扮演的角色,Thread 扮演的角色,而 Task 扮演的角色。Thread 引擎透過 Runnable 接口,呼叫了 Task 的 run()等函數(shù)。稱之為Thread, Runnable, Task造形。如果只想呈現(xiàn)出框架部分(即和元素),可表示為: Thread, Runnable, 。,這是每一位 Java 開發(fā)者都常用的多線程(Multi-T
16、hread)機制,只是許多人都會用它,卻不曾展現(xiàn)溫柔的心境,欣賞一下它的美麗身影,享受 Android 框架之美,實在可惜!。258如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_067.2.3以 BaseAdapter 接口類別為例面第 5.5 節(jié)里,已經(jīng)詳細介紹過 ListView 框架的用法,其中 BaseAdapter就是這個框架的接口(Callbackerface),如下圖:圖 7-7、ListView 框架及其類別接口從前面第 5.5 節(jié)里,你已經(jīng)熟悉 ListView 會呼叫BaseAdapter 接口的getCount()等函數(shù)(實際呼叫到 AP 子類別)?;?/p>
17、類 ListView 透過 BaseAdapter 接口而反向呼叫到子類 myAdapter 的 getCount()和 getView()等函數(shù),取得了初次顯示的選單內(nèi)容,呈現(xiàn)于 ListView 窗口上給 User 挑選(如下圖形所示)。之后,當(dāng)子類內(nèi)容有改變時,就會正向呼叫 BaseAdapter 的 notifyDataSetChanged()函數(shù),來通知 ListView 改變窗口的顯示內(nèi)容。值得留意的是,從數(shù)據(jù)的 (Dataflow)的路徑來看,myAdapter 子類是主動的,數(shù)據(jù)有所變動時,主動通知 ListView 來更改窗口所顯示的內(nèi)容。然而,從軟件互動的角度來看,myAd
18、apter 子類是居于的角色。259圖 7-8、ListView 框架的正反向溝通情形于此圖里, BaseAdapter 扮演的角色, ListView 扮演的角色,而myAdapter 扮演 的角色。ListView 引擎透過 BaseAdapter 接口,呼叫了myAdapter 的 getCount()等函數(shù)。必要時,myAdapter 也會透過 BaseAdapter 來呼叫 ListView 的 onChange()函數(shù)。稱之為ListView, BaseAdapter, myAdapter造形。如果只想呈現(xiàn)出框架部分(即和元素),可表示為:ListView, BaseAdapter
19、,。這是設(shè)計 UI 畫面布局時,常用到的 ListView 架構(gòu),只要懷者溫柔的心,以及 EIT 造形,就能欣賞一下它的美麗身影了。260如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_067.2.4以 View 接口類別為例在剛才的 ListView 框架里,ListView 基類扮演引擎角色。然而 ListView 取也從其父類別 View 繼承了擔(dān)任接口的角色。從 View接口角色可以尋找到與它搭配的引擎角色:就是 ViewRoot。這個 EIT 造形如下:圖 7-9、View 框架的結(jié)構(gòu)也許你會問到,如何從 View 接口角色找到它的引擎角色呢? 這倒是這倒是一件簡單
20、的事:只要看看如何將輪胎裝配到引擎就知道了。這就留到本章后上圖的結(jié)構(gòu)命名為 View 框架;又稱為:ViewRoot,段再來說明了。所以,View, 造形。它的正、反呼叫情形如下圖所示。由于 ViewRoot 對象是由 Android 框架的其它類別(即 WindowManagerImpl)所誕生,而不是由 AP 子類別所誕生,AP 開發(fā)者并不會直接用到它,所以對它并不太熟悉。在這框架里,ViewRoot 呼叫 View 的 draw()函數(shù),轉(zhuǎn)而反向呼叫子類 myView的 onDraw()函數(shù)。必要時,myView 子類會正向呼叫 View 的 invalidate()等函數(shù),轉(zhuǎn)而呼叫 V
21、iewRoot 的 invalidateChild()函數(shù)。如下圖:261圖 7-10、View 框架的正反向溝通情形這框在這個 EIT 造形里,Activity 扮演的角色,ActivityThread 扮演的角色,而 myActivity 扮演的角色。ActivityThread 引擎透過 Activity 接口,呼叫了 myActivity 的 onCretae()函數(shù)。7.2.5以 Activity 接口類別為例Activity接口的引擎:ActivityThread 類別大家最熟悉的 Activity 類別,也扮演著接口的角色;可能這會出乎你的預(yù)料之外。其實,大多數(shù) AP 開發(fā)者所熟
22、悉的框架類別,都常常扮演接口的從 Activity角色。接口角色可以尋找到與它搭配的引擎角色:就是ActivityThread。由于 AP 開發(fā)者較孰悉 Activity 這個概念,所以就稱為 Activity框架;或稱為:ActivityThread, Activity, 造形,如下圖:262如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_06圖 7-11、Activity-ActivityThread 框架的結(jié)構(gòu)這框架的反向呼叫就是: onCreate()函數(shù)。當(dāng) ActivityThread 透過Instrumenion 類別去誕生 myActivity 的對象時,就會
23、立即呼叫 Activity onCreate()函數(shù),并轉(zhuǎn)而反向呼叫 myActivity 的 onCreate()函數(shù)如下圖:的的圖 7-12、Activity 框架的正向呼叫263Activity接口的另一個引擎:Phindow 類別在上圖 myActivity 里的 onCreate()函數(shù)都會正向呼叫 setContentView(),此時不會呼叫 ActivityThread,而是呼叫到另一個引擎:Phindow。此時,也找到另一個框架造形:Phindow, Activity, ,如下圖:圖 7-13、Activity-Phindow 框架的結(jié)構(gòu)由于 Phindow 對象是由 And
24、roid 框架的其它類別所誕生,而不是由AP 子類別所誕生,AP 開發(fā)者并不會直接用到它,所以對它并不太熟悉。當(dāng)用戶去觸摸 UI 窗口時,Android 系統(tǒng)會透過 Phindow 去呼叫 Activity接口類別的 dispatchTouchEvent()函數(shù),轉(zhuǎn)而呼叫 myActivity 的 onTouchEvent()函數(shù)。如下圖:264如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_06圖 7-14、Activity 框架的正、反向溝通情形首先 Android 框架誕生 myActivity 輪胎,并且把它裝配到 Phindow 引擎上。Phindow 引擎透過 A
25、ctivity 接口來呼叫 myActivity 輪胎;要求它(即myActivity)來誕生 UI 畫面布局(Layout),然后呼叫框基類的 setContentView()函數(shù),把自己 UI 畫面布局交給幕后的 Viewroot 和 WindowManageService,以便顯示出UI 畫面。當(dāng)用戶去觸摸 UI 畫面時,Android 系統(tǒng)會透過 Phindow 去呼叫 Activity接口類別的 dispatchTouchEvent()函數(shù),轉(zhuǎn)而呼叫 myActivity 的 onTouchEvent()函數(shù)(如上圖)。以上的互動流程,其實所有的 Android 開發(fā)者都使用過了,只
26、是我心懷著 EIT造形,看到其中的無限美感,并繪圖來呈現(xiàn)之,也附加說明罷了。2657.3EIT 造形的重復(fù)組合在本章的前半段(7.1 和 7.2 節(jié)),試圖引導(dǎo)你:心懷 EIT 造形,欣賞一片楓葉里的元素、及其創(chuàng)造出來的復(fù)雜而多樣化的內(nèi)涵。如下述:(取自接下來的本章后半段,則試圖引導(dǎo)你:心懷 EIT 造形,欣賞多片楓葉的組合韻律,享受楓葉林的整體之美。每一片楓葉都是:一個輪廓相同而內(nèi)涵不同的造形。它們依循某種規(guī)律而組樹枝、樹木和樹林。如下述:(取自這種規(guī)律,稱之為:造形的外部組合規(guī)律。266如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_067.3.1造形外部的組合規(guī)律在上一
27、節(jié)里,已經(jīng)領(lǐng)悟了 EIT 造形的三項特性、熟悉其元素,以及元素的不同組合,覆予各個造形不同的內(nèi)涵。在上一節(jié)里,也拿物理學(xué)上的原子造形來與 EIT 造形來對比:氫原子(H)和氧原子(O)兩者的都是原子造形。這兩個造形輪廓相同(都是原子造形),但是內(nèi)涵不同。在某項規(guī)律下,兩個氫原子(H)造形,可以和一個氧原子(O)造形,相互結(jié)合而形成一個水分子(H2O)。在生物界里,也是如此。例如,每一片樹葉(如楓葉或橄欖樹葉)都是一個輪廓相同而內(nèi)涵不同的造形。它們會依循某種規(guī)律而組樹枝,如下圖所示:圖 7-15、樹葉造形的(外部)組合規(guī)律從上圖里,很容易看出其組合的規(guī)律性,及其無限的自我類似與重復(fù)。于是,樹葉持
28、續(xù)自我重復(fù),就組成較大的樹枝(如上圖)。樹枝再自我重復(fù),就成為一棵樹。樹再自我重復(fù),就成為一座森林了。由于無盡的自我重復(fù),同一棵樹上的眾多葉子皆有共同的結(jié)構(gòu)、一致的型態(tài)。其具有整體的和諧感覺,而且擁有該樹獨特的風(fēng)味。一致的造形就如同 (Gene),決定葉子的巨觀結(jié)構(gòu),卻267也支撐并創(chuàng)造出每片葉子細膩的特殊內(nèi)涵,此外也讓眾多樹葉能和諧地創(chuàng)造出無限的特殊組合體:一顆樹。以上所述的樹葉是個造形,經(jīng)由簡單重復(fù)組合及修修補補而成為一棵樹,甚至一座森林。當(dāng)反向細觀葉子的復(fù)雜,也會看到葉子也是一個整體,也是由更小的、更簡單的序而形成的。一直小到 DNA 都是呈現(xiàn)單純造形、內(nèi)涵不同、重復(fù)組合的特性。例如,S
29、teven Vogel 在一書的作者(Steven Vogel)就提到了:一個 DNA 旋形的結(jié)構(gòu),可以由完全相同的小形成(好比一面墻是由相同結(jié)構(gòu)的磚砌成);再者,每一個小所的方式,與別的小一模一樣。只要你一旦明白一個 DNA 結(jié)構(gòu)的裝置方式,你可以掌握全部。DNA 的螺旋形式結(jié)構(gòu)如下:圖 7-16、DNA 造形的螺旋狀組合DNA 的小就是造形,內(nèi)涵可簡單也可能復(fù)雜,但輪廓簡單一致,組合規(guī)則也簡單,不過組合出來的 DNA 螺旋結(jié)構(gòu)的內(nèi)涵卻極為復(fù)雜,但結(jié)構(gòu)外形仍是簡單的。生物從 DNA 開始就是依循信息局限性的原則所規(guī)范的,因而創(chuàng)造出生物的有機次序(anic Order),帶來和諧而多彩多姿的大
30、自然。268如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_067.3.2 一個類別兼具引擎角色剛才說明了,當(dāng)心懷心懷楓葉單純造形去楓葉樹林時,會發(fā)現(xiàn)其單一造形所創(chuàng)造出來的整體之美。以此類推,當(dāng)心懷 EIT 單純造形去Android框架時,也會發(fā)現(xiàn)其單純造形所創(chuàng)造出來的整體之美。那么,在多個 EIT 造形又如何組成一個整體框架呢? 其有多種組合型式。常見的形式之一是:一個類別扮演兩種角色:扮演如 View 類別就是了,如下圖所示:接口,又兼具引擎角色。例圖 7-17、組合型式:一個類別兼具和引擎兩種角色View 參與兩個造形,它是 ViewRoot 框架里的接口角色;又是 V
31、iew 框架里的引擎角色。換句話說,其中,View 在ViewRoot, View, 造形里扮演角色;同時它在另一個造形:View, onClickListener, 里又扮演的角色。于是,就形成兩個造形的外部組合了。于是,接口類別可兼具引擎角色就是一項造形的組合規(guī)律。2697.3.3父類別,子類別是引擎一般而言,造形的組合規(guī)律愈簡單愈好,致多以不超過 20 項為宜。例如,貨柜(集裝箱)造形的組合規(guī)律就很簡單了。XML 造形就只有樹狀組合而已,愈簡單愈具有流行的爆發(fā)力。再如 Object-Oriented架構(gòu)下,類別造形只有數(shù)據(jù)項,函數(shù)兩種元素,然而類別造形之間的組合規(guī)律就復(fù)雜多了。至于 EI
32、T 造形的組合規(guī)律,也有 10 多項,算是合理的范圍?,F(xiàn)在,就來看另一種組合情形。如下圖:圖 7-18、組合型式:父子類別各扮演和引擎此圖含有兩個 EIT 造形: ViewRoot, View, 和 SurfaceView,270如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_06Callback,。它們是透過類別的繼承關(guān)系(即 SurfaceView 類別繼承 View 類別)而組合在一起。7.3.4多個造形共享這種組合規(guī)律是由兩個 EIT 造形共享角色而形成的,如下圖:圖 7-19、組合型式:一個類別參與兩個造形這種組合規(guī)律有效減少 AP 子類的數(shù)目。例如原來應(yīng)該兩個獨立
33、的造形:indow, Activity, 和 View, onClickListener, 。對于 AP 開發(fā)Ph者來說,他可以撰寫 myActivity 去執(zhí)行角色,而且撰寫 myView 去執(zhí)行271角色。他也可以只撰寫一個類別去執(zhí)行和兩個角色。這讓 AP 開發(fā)者有彈性選擇的空間。7.3.5Factory-Product 造形組合這是 Android 的 AP 開發(fā)里,幾乎天天都會碰到的場景,就是:由一個角色去誕生另一個角色的對象(輪胎),并且負責(zé)把它裝配到引擎上。可表示如下圖:圖 7-20、Factory-Product 造形組合為什么會有這樣的組合呢? 因為 EIT 造形就是意味著:把
34、輪胎(T)拔掉,得到接口(I),于是將引擎與輪胎分離了。既然分離了,又誕生輪胎呢?把輪indow,胎裝配到引擎呢? 例如,在 Android 框架里有三個重要的EIT 造形:Ph272如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_06Activity, myActivity 、 ViewRoot, View, Button 和 View, onClickListener,myActivity。在 Android 框架里,這三者的組合情境,就如下圖所示:圖 7-21、 Android 典型的 EIT 造形組合三者組合互動的過程是:首先 Android 框架誕生 myActiv
35、ity 輪胎,并且把它裝配到 Ph上。indow 引擎273Phindow 引擎透過 Activity 接口來呼叫 myActivity 輪胎;要求它(即myActivity)來誕生 Button 輪胎,并且把自己(即 myActivity)的 onClickListener接口裝配到 Button 輪胎(含基類別 View)里。myActivity 呼叫 setContentView() 函數(shù)來將 Button 輪胎的接口傳遞給 PhPhindow 引擎。indow 引擎再把 Button 輪胎接口傳給 WindowManagerImp,委托它來裝配到 ViewRoot 引擎上。此時,輪胎都
36、裝配好了;UI 畫面也顯示了。用戶就能觸摸 UI 畫面的按鈕(即 Button 輪胎),觸發(fā)了 UI 事件,Android 框架就把事件傳送給 ViewRoot 引擎。ViewRoot 引擎就透過 View 接口而呼叫到 Button 輪胎。Button 輪胎(含基類別 View)就透過 onClickListener 接口來呼叫 myActivity 輪胎的 onClick()函數(shù)。以上的互動流程,其實所有的 Android 開發(fā)者都使用過了,只是我心懷著 EIT造形,看到其中的無限美感,并繪圖來呈現(xiàn)之,也附加說明罷了。也大家非常熟悉的 Android 程序碼。茲將上圖到程序碼,如下:/ m
37、yActivity.java (Ex07 01)package com.misoo.pk002; import android.app.Activity; import android.os.Bundle; import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;public class myActivity extendivity implements OnClickListenerpriv
38、ate Button btn;Overrideprotected void onCreate(Bundle icicle) super.onCreate(icicle);LinearLayout layout = new LinearLayout(this); layout.setOrienion(LinearLayout.VERTICAL);274如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_06雖然這是一個簡單的 AP,但簡單幕后卻需要復(fù)雜機制來支撐。而復(fù)雜機制需要有單純的 EIT 造形來將復(fù)雜包容于多變的(造形的)內(nèi)涵之中,呈現(xiàn)出簡單的次序。然后再將多個造形依循簡單的
39、組合韻律,組織成巨大而美麗的系統(tǒng)。 Android 的 AP 開發(fā)者只需依循簡單的組合韻律,就能創(chuàng)造無限多的 AP 了,而且 AP 的內(nèi)容也變得簡單了(如上述的程序碼)。此程序顯示出如下畫面,來支撐系統(tǒng)與用戶的觸控互動。如下的畫面:麻雀雖小,幕后的五藏卻是一一俱全的。有了 EIT 造形,目前幕后都是美麗的,不是嗎?btn = new Button(this); btn.setOnClickListener(this); btn.setText(Exit); btn.setBackgroundResource(R.drawable.gray); LinearLayout.LayoutParams
40、 param1 =new LinearLayout.LayoutParams(150, 55);param1.topMargin = 10;param1.leftMargin = 10; layout.addView(btn, param1); setContentView(layout);public void onClick(View v) finish();2757.3.6Server-Ses造形組合這是 Factory-Product 造形組合的一種特殊情形。當(dāng)許多 Cnt 會同時要求一個 Server 提供服務(wù)時,為了其(Ses)的攸關(guān)數(shù)據(jù),就會定義一個新類別來扮演這個 Ses角色,
41、以便之。例如,在 Web Service 環(huán)境里,大家都熟悉 Ses的概念。在 Android 的 WMS(WindowManagerService)和 Surflinger 等系統(tǒng)服務(wù)里,也都有定義了特定類別來扮演 Ses角色;因為它們是幕后工作,從 AP 開發(fā)者角度通常不會看到他們的蹤跡。于此,子,就是 Service/Binder 架構(gòu),如下圖:舉AP 開發(fā)者熟悉的例圖 7-22、基于 Server-Ses的造形組合這是 Binder 造形與 Service 造形的組合。其中,Service 造形扮演 Factory 角色,而 Binder 造形則扮演 Product 角色。在 Bind
42、er 造形里,Binder 是角色,它的引擎()是在另一個進程里的執(zhí)行程序如下:(Remote)的 Cnt(例如 Activity 的子類)。通常的276如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_06當(dāng) Service 框架執(zhí)行其 onCreate()或 onStart()函數(shù)時,就會誕生一個 myBinder對象。這是誕生輪胎的任務(wù)。當(dāng) Service 框架執(zhí)行其 onBind()函數(shù)時,就會將該對象的 IBinder 接口傳送給遠的 Cnt(即是 Binder 框架的引擎角色,例如 Activity 的子類)。這是裝配輪胎的任務(wù)。裝配好了,Cnt 就透過 IBind
43、er 接口轉(zhuǎn)接到 Binder接口,轉(zhuǎn)而呼叫到 myBinder 的 onTran()函數(shù)了。這是反向呼叫。對于 Android 的 AP 開發(fā)者而言,這是非常熟悉的應(yīng)用程序架構(gòu)了,如下圖:圖 7-23、大家熟悉的 Android AP 程序架構(gòu)由于每一位 AP 開發(fā)者都非常熟悉了,在此就不多說明了。2777.4范例演練:親自動手組合造形剛才所介紹的 EIT 造形組合,都是 Android 框架里的范例。雖然感覺蠻壯觀的,但是終究不是自己親自動手去組合的,并不夠親切感。在本節(jié)里,將拿 Android 框架里既有的 EIT 造形來組合。也就是先拿別人創(chuàng)造的 EIT 造形來組合一番,但是暫時不自己
44、創(chuàng)造 EIT 造形。就好像,拿的唐詩(每一首 7 言絕句唐詩都有一致的輪廓、一致的元素組合韻律,但每一首詩都是具有獨特內(nèi)涵的造形)來組合吟唱一番。但是暫時不自己創(chuàng)作新詩。到了下一章(第 8EIT 造形了。,就會詳細說明如何自己作唐詩、創(chuàng)作自己的框架7.4.1基于Thread, Runnable, 造形前面介紹過了 Thread 框架,也就是Thread, Runnable, 造形。如下圖所示:圖 7-24、框架設(shè)計師眼中的 Thread 機制基于這個Runnable 接口,Thread 基類就能誕生一個新線程,并透過 Runnable接口去呼叫子類別的 run()函數(shù)。如下圖所示:278如何開
45、發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_06圖 7-25、Thread 框架的正反向溝通情形這個 Thread 類別扮演引擎角色,Runnable 是接口,而 Task 則是輪胎。在 Thread 的 start()函數(shù)會誕生一個小線程,反向呼叫 Task 的 run()函數(shù);必要時, Task 會正向呼叫 Thread 的 currentThread()等函數(shù)。換句話說,Runnable 扮演的角色,Thread 扮演的角色,而 Task 扮演的角色。Thread 引擎透過 Runnable 接口,呼叫了 Task 的 run()等函數(shù)。Thread, Runnable,
46、 Task造形,或稱為: Thread, Runnable, 造形。在本質(zhì)上,接口就是純粹抽象類別(Pure Abstract Class),所以也能將接口里的抽象函數(shù)并入到里,就得到一個變異形,如下圖所示:稱之為279圖 7-26、Thread 造形的變異形在本質(zhì)上,上述兩個圖(圖 0-9 和圖 0-10)的涵義是一樣的,只是結(jié)構(gòu)不一樣而已。7.4.2開始演練組合接下來,依循前面第 7.3 節(jié)里的多個造形共享組合規(guī)律,可以將兩個造形組合起來,如下圖:280如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_06圖 7-27、View 造形與 Thread 造形的組合這是把 ru
47、n()函數(shù)寫進 View 的子類別里。同樣的結(jié)構(gòu),你也可以將 run()函數(shù)寫進 Activity 的子類別里。于是,可促成 Thread 造形與 Activity 造形的新組合(依循相同的組合規(guī)律),如下圖所示:281圖 7-28、Activity 造形與 Thread 造形的組合由于在這個程序只會誕生 myActivity 對象,卻可能誕生多個 Thread 對象,可能出現(xiàn)多條線程同時并行(Concurrently)執(zhí)行 run()函數(shù)的情形。此時必須特別留意線程問題。也就是多條線程共享變量或?qū)ο?,?dǎo)致互相干擾計算中的變量值,因而產(chǎn)生錯誤的計算結(jié)果。例如,依據(jù)上圖的設(shè)計結(jié)構(gòu),撰寫程序碼,可
48、能無意中這會產(chǎn)生了,如下范例:/ myActivity.java (Ex07_02)package com.misoo.pk002; import android.app.Activity; import android.os.Bundle; import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;282如何開發(fā) Android 應(yīng)用框架:EIT 門派秘笈By2012_06第一個線程還沒做完
49、run()函數(shù)的計算,其后的第二個線程就進來 run()函數(shù),并行共享了 sum 變量值,因而輸出錯誤的結(jié)果:11373。public class myActivity extendivity implements OnClickListener, Runnable private Button ibtn;privatesum;Overrideprotected void onCreate(Bundle icicle) super.onCreate(icicle);LinearLayout layout = new LinearLayout(this); layout.setOrienion(LinearLayout.VERTICAL);ibtn = new Button(this);ibtn.setOnClickListener(this); ibtn.setText(Exit);ibtn.setBackgroundResource(R.drawable.gray); LinearLayout.LayoutParams param1 =new Lin
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 項目托管合同范例
- 飯店引流合同范例簡短
- app推廣服務(wù)合同范例
- 購銅合同范例
- 合同范例神器
- 化妝培訓(xùn)員工合同范例
- 裝修材料合同合同范例
- 學(xué)校托管采購合同范例
- 銷售合同范例建陶
- 員工入職檔案合同范例
- 珠寶店應(yīng)急預(yù)案范本
- 有限空間作業(yè)安全管理協(xié)議
- 勞務(wù)派遣方案
- 介紹河南的英文課件演講
- 道路綠化養(yǎng)護投標(biāo)方案(技術(shù)方案)
- 跨省戶口網(wǎng)上遷移告知單
- 屋面工程質(zhì)量控制
- 高中英語校本教材《英語美文閱讀與欣賞》
- 【高中語文】《鄉(xiāng)土中國-家族》課件19張+統(tǒng)編版必修上冊
- 二年級上冊英語說課稿-Module 4 Unit 2 He doesn't like these trousers|外研社(一起)
- 重型燃氣輪機
評論
0/150
提交評論