• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      一種基于Android混合開發(fā)模式的軟件架構(gòu)設(shè)計(jì)

      2017-03-06 00:06馬壯陳年飛史夢安王志勃
      軟件導(dǎo)刊 2017年1期
      關(guān)鍵詞:設(shè)計(jì)模式

      馬壯+陳年飛+史夢安+王志勃

      摘要摘要:Hybrid混合開發(fā)模式利用Android/IOS Native UIWebView作為底層,采用本地編碼與遠(yuǎn)程服務(wù)器進(jìn)行通信,采用HTML、CSS、JavaScript等富客戶端技術(shù)對顯示層進(jìn)行處理。該模式具有較為優(yōu)秀的跨平臺性、快速的軟件更新、媲美Native代碼的運(yùn)行效率,在降低開發(fā)成本的同時(shí)保證了較好的用戶體驗(yàn),兼具Native APP和Web APP的優(yōu)點(diǎn)。設(shè)計(jì)基于Android混合開發(fā)模式的軟件架構(gòu),同時(shí)利用Android線程間通信技術(shù)以及工廠設(shè)計(jì)模式對架構(gòu)進(jìn)行優(yōu)化改進(jìn),提高移動(dòng)應(yīng)用程序的開發(fā)效率。

      關(guān)鍵詞關(guān)鍵詞:Android;WebView;Hybrid混合開發(fā);設(shè)計(jì)模式;軟件架構(gòu)設(shè)計(jì)

      DOIDOI:10.11907/rjdk.162691

      中圖分類號:TP319文獻(xiàn)標(biāo)識碼:A文章編號文章編號:16727800(2017)001009304

      引言

      隨著移動(dòng)互聯(lián)的興起及移動(dòng)設(shè)備計(jì)算能力的提升,各種移動(dòng)應(yīng)用程序?qū)映霾桓F,快速的業(yè)務(wù)擴(kuò)展要求必須提升開發(fā)效率。Android和IOS 原生開發(fā)的成本和效率很難取得實(shí)質(zhì)性突破,且Native APP可移植性較差,不同平臺需各自維護(hù)UI以保證用戶體驗(yàn)的一致性。Web APP雖擁有超強(qiáng)的跨平臺性,但受網(wǎng)絡(luò)限制無法調(diào)用系統(tǒng)級API等問題一直沒有較好的解決方案。因此,Hybrid混合APP應(yīng)運(yùn)而生[1]。

      不同于Native APP針對特定平臺的開發(fā),Hybrid APP 表面上是一個(gè)Native APP,實(shí)際上顯示的是存儲在本地的Web App。Hybrid APP底層依賴于Native提供2.4ICE客戶端開發(fā)

      在實(shí)現(xiàn)服務(wù)器程序框架的基礎(chǔ)上,即可實(shí)現(xiàn)多種功能的服務(wù)器程序。而客戶端不需要考慮服務(wù)器端程序的編程語言及運(yùn)行平臺,只需通過調(diào)用Servant,即可與服務(wù)器進(jìn)行數(shù)據(jù)通信,并使用服務(wù)器上提供的服務(wù)。

      ICE客戶端在建立連接時(shí)是通過繼承 Ice::Application 類并重載 virtual int run(int, char*[])方法完成的,然后通過間接代理來調(diào)用服務(wù)器端相關(guān)操作??蛻舳舜a流程為:使用Servant名稱和適配器地址建立代理,代理轉(zhuǎn)換為繼承類的Servant的過程,操作完畢,釋放相關(guān)資源。3結(jié)語

      ICE中間件技術(shù)簡單、高效,因此自誕生以來發(fā)展迅速。相對于國外已經(jīng)出現(xiàn)較多關(guān)于ICE的學(xué)術(shù)探討和應(yīng)用研究,國內(nèi)對ICE的研究及其在各個(gè)領(lǐng)域的應(yīng)用都還處于起步階段。本文采用ICE中間件技術(shù)設(shè)計(jì)應(yīng)用系統(tǒng)通信框架,探討體系結(jié)構(gòu)并搭建框架,為基于ICE中間件的網(wǎng)絡(luò)應(yīng)用系統(tǒng)開發(fā)提供參考。利用此架構(gòu)單獨(dú)開發(fā)應(yīng)用系統(tǒng)的通信框架,以后ICE版本的升級或通信代碼的改變對整個(gè)應(yīng)用系統(tǒng)的影響都比較小。服務(wù)器和客戶端無需考慮通信帶來的復(fù)雜性,可以專注于具體業(yè)務(wù)的實(shí)現(xiàn)。

      Hybrid開發(fā)模式作為一種跨語言開發(fā)模式,開發(fā)應(yīng)圍繞通訊層展開。在Android平臺中,WebView組件為Android提供了無需依賴瀏覽器即可加載Web頁面的功能[3],并提供JS、Java相互通訊的接口。WebView使用addJavaScriptInterfaceAPI在HTML中注入本地Java對象,使得JS腳本可調(diào)用本地Java對象,Java使用loadUrlAPI加載本地頁面資源或執(zhí)行JS腳本[4]。

      系統(tǒng)啟動(dòng)時(shí),在主線程(UI線程)的onCreate中初始化WebView組件;通過loadUrlAPI加載本地HTML資源繪制界面,并使用addJavaScriptIntfaceAPI為當(dāng)前HTML的JS腳本注入本地Java對象;WebView在解析JS腳本時(shí)會過濾該關(guān)鍵字作為對象進(jìn)行處理;當(dāng)腳本執(zhí)行到注入的Java對象時(shí),WebView會自動(dòng)調(diào)用該Java對象相應(yīng)的方法。邏輯處理完成后,使用 loadUrlAPI加載HTML資源或執(zhí)行JS腳本。

      但難以直接使用Hybrid技術(shù)開發(fā)。JS與Java之間的交互零散分布在整個(gè)系統(tǒng)中,資源分散不成體系;功能界限模糊,可擴(kuò)展性差;系統(tǒng)耦合度高,開發(fā)效率低[5]。對此,可以設(shè)計(jì)一套基于Android的混合開發(fā)模式的軟件架構(gòu)。

      2基于Hybrid開發(fā)模式的軟件架構(gòu)設(shè)計(jì)

      2.1WebView擴(kuò)展

      為簡化調(diào)用,提高方法靈活性,對WebView進(jìn)行擴(kuò)展。定義SWebView繼承WebView,定義loadAssets()方法包裝LoadUrl()以加載本地HTML資源,參數(shù)為html文件名。定義execJS()方法包裝LoadUrl()以執(zhí)行JS腳本,參數(shù)為JS函數(shù)名和JS參數(shù)。定義addJSInterface()方法包裝addJavaScriptInterface()以加載本地Java對象,參數(shù)為對象和注入的對象名。SWebView類如圖3所示。

      為整合JS、Java零散交互資源,提高系統(tǒng)可擴(kuò)展性、降低耦合,可將顯示層抽象為“窗口”對象(BaseFrame)。加載HTML頁面的兩個(gè)參數(shù):本地資源路徑和注入的Java對象名不足以更新視圖,比如執(zhí)行JS腳本和頁面返回邏輯。只能直接調(diào)用WebView的方法更新視圖或關(guān)閉線程,提升模塊耦合度。在處理頁面返回邏輯時(shí),系統(tǒng)中可以打開很多個(gè)頁面,有返回上一頁和退出程序兩種情況,只有一個(gè)WebView容器。由于WebView的生命周期限制,需在BaseFrame中記錄當(dāng)前BaseFrame以支持goBack()處理。

      由于WebView自始至終只有一個(gè)且運(yùn)行在主線程中,頁面切換所變更的只是HTML資源和注入的本地Java對象??梢越Y(jié)合裝飾設(shè)計(jì)模式[6],在BaseFrame中包裹SWebView對象、Context上下文環(huán)境和自身實(shí)例,使BaseFrame可以最大限度的復(fù)用共有資源(如圖4)。

      BaseFrame定義3個(gè)帶參構(gòu)造方法,以靈活裝載“窗口”對象資源。在BaseFrame中封裝方法,調(diào)用自身SWebView的方法,使“窗口”視圖更新操作都由BaseFrame自身執(zhí)行,有效降低耦合。定義setVisible()調(diào)用SWebView的loadUrl()和addJSInterface(),在加載HTML資源的同時(shí)注入Java本地對象并記錄當(dāng)前BaseFrame。定義execJS()轉(zhuǎn)發(fā)調(diào)用SWebView的execJS()。具體類圖如圖5所示。

      3架構(gòu)使用

      系統(tǒng)啟動(dòng)時(shí),在MainActivity的onCreate()方法中初始化WebView相關(guān)設(shè)置,并使用4個(gè)參數(shù)的構(gòu)造方法(Html,SWebView,Context,jsObjectName)實(shí)例化LoginFrame登錄頁,調(diào)用LoginFrame.setVisible()方法更新視圖。此時(shí)Login頁面的JS腳本中觸發(fā)LoginFrame.login_native()方法后,WebView會自動(dòng)調(diào)用Java中LoginFrame對象的login_native()方法。判斷登錄成功后,使用4個(gè)參數(shù)的構(gòu)造方法實(shí)例化MainFrame主界面(SWebView和Context與LoginFrame相同),同時(shí)調(diào)用MainFrame.setVisible()方法更新視圖,便可使用MainFrame.execJS()在主界面執(zhí)行JS腳本或者直接執(zhí)行g(shù)oBack()退出系統(tǒng)。使用流程如圖6所示。

      使用BaseFrame描述“窗口”對象,使頁面資源模塊化,功能內(nèi)聚,降低耦合度, 開發(fā)者無需專注于資源整合,可以更專注于業(yè)務(wù)開發(fā)。

      3.1改進(jìn)框架

      在Android4.4版本之后,WebView所有方法必須在同一線程中調(diào)用。而Android在MainActivity的onCreate方法中初始化WebView,WebView屬于主線程。當(dāng)JS腳本調(diào)用Java方法時(shí),被調(diào)用的Java方法在子線程中執(zhí)行,此時(shí) Java方法調(diào)用主線程WebView的方法會顯示“WebView方法在不同線程中調(diào)用”的異常,可能會引發(fā)應(yīng)用程序崩潰(見圖7)。

      為此需要將WebView的所有方法同步調(diào)用,可使用Handler進(jìn)行線程間通訊。將Handler初始化在主線程中,它與子線程可通過Message對象來傳遞數(shù)據(jù)。Handler接受子線程sendMessage()方法傳入的Message對象(內(nèi)含數(shù)據(jù)),將這些消息放入主線程的消息隊(duì)列,配合主線程更新UI。Handler通訊如圖8所示。

      子線程Java中獲取主線程的Handler后,使用Handler.sendMessage()方法向主線程Handler發(fā)送消息。主線程WebView中重寫Handler消息隊(duì)列的處理方法,給WebView的每個(gè)方法都構(gòu)建相應(yīng)的Handler調(diào)用方法,允許Handler接收到消息就轉(zhuǎn)發(fā),調(diào)用相應(yīng)的WebView方法。但其缺陷也是顯而易見的:調(diào)用一個(gè)WebView的方法就要單獨(dú)構(gòu)建一個(gè)Handler進(jìn)行處理,代碼冗余度和耦合度較高,可擴(kuò)展性不強(qiáng)。

      3.2使用“工廠”設(shè)計(jì)模式對Handler進(jìn)行改進(jìn)

      為降低使用Handler通訊導(dǎo)致的高冗余度、高耦合度,基于“工廠”設(shè)計(jì)模式[7]結(jié)合Java反射技術(shù),對Handler通訊進(jìn)一步優(yōu)化。在SWebView的Handler的消息處理方法中建立Method對象反射工廠。傳入方法名、參數(shù)類型列表和參數(shù)即可自動(dòng)生成相應(yīng)的Method對象進(jìn)行調(diào)用[8],如圖9所示。

      Java通過sendMessage()向主線程Handler消息隊(duì)列發(fā)送需要調(diào)用的方法名、參數(shù)類型列表和具體參數(shù)。Handler不直接調(diào)用WebView的方法,由Method反射工廠生成Method對象進(jìn)行調(diào)用,如圖10所示。

      基于Handler Method反射工廠的通訊模式,可有效降低模塊耦合度和減少代碼冗余,提高功能內(nèi)聚,增強(qiáng)可擴(kuò)展性和兼容性。最終系統(tǒng)架構(gòu)如圖11所示。

      系統(tǒng)啟動(dòng)時(shí)在主線程的onCreate方法中初始化WebView設(shè)置,實(shí)例化首頁的BaseFrame實(shí)現(xiàn)類。傳入當(dāng)前的WebView、Context、資源地址以及需注入的Java對象名后,APP首頁即可完成繪制,在首頁HTML的JS腳本中可隨意調(diào)用已注入的Java對象, Java對象在子線程中處理業(yè)務(wù)邏輯后,調(diào)用BaseFrame相關(guān)方法,無需在不同線程操作WebView,即可完成JS與Java的交互閉環(huán)。

      4結(jié)語

      采用Android的Hybrid混合開發(fā)模式框架,基于裝飾設(shè)計(jì)模式從顯示層抽象設(shè)計(jì)BaseFrame,擁有較好的可擴(kuò)展性和兼容性,有效降低了模塊間的耦合度,提高了模塊的健壯性和功能內(nèi)聚性。使用Handler消息機(jī)制,解決Android4.4版本后關(guān)于WebView在不同線程調(diào)用引發(fā)異常問題。結(jié)合“工廠”設(shè)計(jì)模式和Java反射技術(shù),建立Method對象反射工廠,保證框架良好的兼容性。經(jīng)實(shí)際項(xiàng)目驗(yàn)證,本框架具有較高的擴(kuò)展性及穩(wěn)定性,為Android開發(fā)者提供了一個(gè)較好的Hybrid混合APP開發(fā)框架。

      參考文獻(xiàn):

      [1]周齊飛.基于Android平臺的Hybrid App開發(fā)[J].電腦編程技巧與維護(hù),2014(15):4648.

      [2]宋小遠(yuǎn),薛云志.一種Android平臺混合應(yīng)用運(yùn)行環(huán)境[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2016(9):98103.

      [3]肖瑤.基于WebView的Android應(yīng)用Web交互行為分析與研究[D].北京:北京郵電大學(xué),2015.

      [4]龐程,崔宣,粟潘,張永順.基于Android平臺HTML5的研究與實(shí)現(xiàn)[J].機(jī)械管理開發(fā),2012(6):136137.

      [5]史夢安,王志勃.基于Android系統(tǒng)的TCP/IP客戶端異步通信模塊研究[J].軟件導(dǎo)刊,2014(10):115118.

      [6]王芳,耿祥義,趙震.Java程序中的設(shè)計(jì)模式以及應(yīng)用舉例[J].電腦知識與技術(shù),2007(8):438439.

      [7]李文錦.Java程序中設(shè)計(jì)模式的抽取方法[D].長春:吉林大學(xué),2005.

      [8]張晶,王國明,許斌龍.Android系統(tǒng)環(huán)境下軟件設(shè)計(jì)模式的研究[J].現(xiàn)代電子技術(shù),2013(20)20:5153.

      責(zé)任編輯(責(zé)任編輯:陳福時(shí))

      猜你喜歡
      設(shè)計(jì)模式
      “1+1”作業(yè)設(shè)計(jì)模式的實(shí)踐探索
      設(shè)計(jì)模式挖掘的有效性評估策略
      三維協(xié)同設(shè)計(jì)模式下的航天項(xiàng)目管理實(shí)踐與展望
      交通機(jī)電工程設(shè)計(jì)模式創(chuàng)新探討
      基于“雙師制”指導(dǎo)下的工業(yè)設(shè)計(jì)專業(yè)畢業(yè)設(shè)計(jì)模式
      互動(dòng)式設(shè)計(jì)模式研究
      宁陕县| 防城港市| 宝山区| 大荔县| 漳州市| 会宁县| 望城县| 黄石市| 连平县| 田东县| 泰州市| 彰武县| 贵港市| 海城市| 香河县| 大连市| 池州市| 达尔| 丰都县| 郎溪县| 喀喇| 广昌县| 河曲县| 开阳县| 大宁县| 玉溪市| 科技| 霍林郭勒市| 静安区| 高陵县| 苍山县| 天全县| 山东省| 读书| 奇台县| 桐柏县| 古浪县| 常熟市| 石门县| 南部县| 万山特区|