連壯
(廈門城市職業(yè)學(xué)院 福建省廈門市 361008)
隨著社會(huì)的飛速發(fā)展,數(shù)據(jù)呈現(xiàn)爆炸式增長(zhǎng),如何避免忘記工作、生活和學(xué)習(xí)中的諸多事情而造成的不良后果就顯得非常重要。為此,筆者開發(fā)一款基于Android 系統(tǒng)的智能記事本APP,通過(guò)記事本APP 能夠便攜記錄生活和工作的諸多事情,記錄學(xué)習(xí)的知識(shí)要點(diǎn),從而幫助人們有條理地進(jìn)行時(shí)間管理,提升學(xué)習(xí)效率。
2021 年是中國(guó)共產(chǎn)黨成立100 周年,習(xí)近平總書記在黨史學(xué)習(xí)教育動(dòng)員大會(huì)上強(qiáng)調(diào),“在慶祝我們黨百年華誕的重大時(shí)刻,在‘兩個(gè)一百年’奮斗目標(biāo)歷史交匯的關(guān)鍵節(jié)點(diǎn),在全黨集中開展黨史學(xué)習(xí)教育,正當(dāng)其時(shí),十分必要。[1]”2022年3 月,中共中央辦公廳印發(fā)《關(guān)于推動(dòng)黨史學(xué)習(xí)教育常態(tài)化長(zhǎng)效化的意見》,要求各地區(qū)各部門結(jié)合實(shí)際認(rèn)真貫徹落實(shí)[2]。在此背景下,用戶通過(guò)智能記事本APP 可以隨時(shí)隨地記錄下學(xué)習(xí)黨史的心得體會(huì),同時(shí)在記事本APP 開頭設(shè)計(jì)添加黨史學(xué)習(xí)、慶祝建黨百年等動(dòng)畫、在記事本界面中設(shè)計(jì)實(shí)現(xiàn)百年黨史新聞和黨史知識(shí)測(cè)試等功能,可以幫助用戶更好地學(xué)習(xí)黨史,推動(dòng)黨史學(xué)習(xí)的常態(tài)化和長(zhǎng)效化。
智能記事本APP 經(jīng)過(guò)開始?xì)g迎動(dòng)畫后會(huì)進(jìn)入記事本界面,記事本界面主要包含內(nèi)容列表、添加按鈕、百年黨史新聞和黨史知識(shí)測(cè)試。當(dāng)長(zhǎng)按列表?xiàng)l目(Item)時(shí),會(huì)彈出一個(gè)提示是否刪除列表?xiàng)l目Item 的對(duì)話框,當(dāng)點(diǎn)擊對(duì)話框中“確定”按鈕時(shí),程序?qū)?huì)刪除該筆記條目,當(dāng)點(diǎn)擊對(duì)話框中的“取消”按鈕時(shí),則會(huì)取消刪除該條目,避免用戶誤操作。當(dāng)點(diǎn)擊記事本界面列表中的Item時(shí),會(huì)跳轉(zhuǎn)到修改記錄界面,該界面可以查看和修改記錄。當(dāng)點(diǎn)擊記事本界面中的“添加”按鈕時(shí),會(huì)跳轉(zhuǎn)到添加記錄界面,該界面可以添加記錄內(nèi)容。當(dāng)點(diǎn)擊百年黨史新聞時(shí),界面會(huì)跳轉(zhuǎn)到黨史百年的新聞頁(yè)面,單擊每個(gè)新聞列表可以閱讀對(duì)應(yīng)的黨史新聞。當(dāng)點(diǎn)擊答題按鈕,界面會(huì)跳轉(zhuǎn)到黨史知識(shí)測(cè)試界面,單擊開始答題后即可進(jìn)入答題,如果答錯(cuò)程序會(huì)進(jìn)行提示,直到回答正確后跳轉(zhuǎn)到下一題。記事本應(yīng)用的系統(tǒng)架構(gòu)如圖1 所示。
圖1:記事本應(yīng)用系統(tǒng)架構(gòu)圖
智能記事本APP 采用Java 語(yǔ)言和Android Studio 開發(fā)工具開發(fā),本文針對(duì)記事本APP 中如何實(shí)現(xiàn)APP 開始?xì)g迎動(dòng)畫,如何實(shí)現(xiàn)存儲(chǔ)管理大規(guī)模記錄數(shù)據(jù),如何進(jìn)行網(wǎng)絡(luò)交互訪問(wèn)這3 個(gè)關(guān)鍵功能進(jìn)行深入的分析與研究。開始?xì)g迎動(dòng)畫、數(shù)據(jù)庫(kù)存儲(chǔ)和網(wǎng)絡(luò)交互訪問(wèn)的技術(shù)實(shí)現(xiàn)思路和方法也同樣適用于其他APP 開發(fā)。
記事本APP 的開始?xì)g迎界面是指用戶進(jìn)入記事本APP之前,短暫停留在手機(jī)界面的指引性頁(yè)面。歡迎界面是用戶對(duì)記事本APP 的第一印象,直接關(guān)系到用戶對(duì)APP 應(yīng)用的整體感受[3]53,好的歡迎界面可以迅速吸引用戶的注意力,提升產(chǎn)品的價(jià)值,能夠起到很好的宣傳教育作用。有些公司在歡迎界面中放置廣告,以此獲得收益。
在Android 系統(tǒng)中通常有兩種動(dòng)畫效果的實(shí)現(xiàn)方式:補(bǔ)間動(dòng)畫及逐幀動(dòng)畫。補(bǔ)間動(dòng)畫是將View 進(jìn)行圖形變化來(lái)達(dá)到相應(yīng)的動(dòng)畫效果,包括縮放、改變透明度、平移、旋轉(zhuǎn)四種。逐幀動(dòng)畫是按照預(yù)先設(shè)置好的靜態(tài)圖片順序播放,通過(guò)眼睛的“視覺(jué)暫留”原理,讓人出現(xiàn)動(dòng)畫的錯(cuò)覺(jué)。逐幀動(dòng)畫的原理類似放膠片電影的原理,都是通過(guò)播放預(yù)先設(shè)置好的一組靜態(tài)圖片來(lái)實(shí)現(xiàn)[4]272。在本文描述的記事本APP 中,筆者采用補(bǔ)間動(dòng)畫實(shí)現(xiàn)記事本APP 的開始?xì)g迎界面。
補(bǔ)間動(dòng)畫的效果可以通過(guò)直接編寫代碼的方式實(shí)現(xiàn),也可以通過(guò)編寫XML 文件的方式來(lái)實(shí)現(xiàn),為了讓邏輯業(yè)務(wù)代碼和視圖動(dòng)畫代碼分離,讓記事本APP 的整體代碼更有條理,更清晰易懂,采用XML 文件的方式來(lái)定義動(dòng)畫。在Android 系統(tǒng)中,補(bǔ)間動(dòng)畫包含縮放動(dòng)畫(ScaleAnimation)、平移動(dòng)畫(TranslateAnimation)、旋轉(zhuǎn)動(dòng)畫(RotateAnimation)、透明度漸變動(dòng)畫(AlphaAnimation)??s放動(dòng)畫是通過(guò)指定動(dòng)畫開始時(shí)的縮放系數(shù)、結(jié)束時(shí)的縮放系數(shù)以及動(dòng)畫持續(xù)時(shí)長(zhǎng)來(lái)實(shí)現(xiàn)。平移動(dòng)畫是通過(guò)指定動(dòng)畫的開始位置、結(jié)束位置以及動(dòng)畫持續(xù)時(shí)長(zhǎng)來(lái)實(shí)現(xiàn)。旋轉(zhuǎn)動(dòng)畫是通過(guò)對(duì)View 指定動(dòng)畫開始時(shí)的旋轉(zhuǎn)角度、結(jié)束時(shí)的旋轉(zhuǎn)角度以及動(dòng)畫播放時(shí)長(zhǎng)來(lái)實(shí)現(xiàn)。透明度漸變動(dòng)畫主要是通過(guò)指定動(dòng)畫開始時(shí)View的透明度、結(jié)束時(shí)View 的透明度以及動(dòng)畫持續(xù)時(shí)間來(lái)實(shí)現(xiàn)[4]273‐274。在本文描述的記事本APP 中分別嘗試采用縮放動(dòng)畫和透明度漸變動(dòng)畫實(shí)現(xiàn)開始?xì)g迎界面,動(dòng)畫的時(shí)長(zhǎng)設(shè)置在4000‐5000毫秒左右,兩種動(dòng)畫各具特色,均受到用戶的喜愛,取得較好的用戶體驗(yàn)。
為實(shí)現(xiàn)記事本APP 的開始?xì)g迎界面(動(dòng)畫),采用以下設(shè)計(jì)思路:
(1)將補(bǔ)間動(dòng)畫界面需要的圖片導(dǎo)入到項(xiàng)目工程的drawable 文件夾中。
(2)在對(duì)應(yīng)的布局文件XML 中,放置ImageView 等界面控件。
(3)把程序中定義動(dòng)畫的XML 文件存放在項(xiàng)目工程的anim 文件夾中。以縮放動(dòng)畫為例,把圖片從屏幕中央由50%放大到100%。創(chuàng)建名為scale 的XML 文件,在該文件中通過(guò)設(shè)置縮放點(diǎn)的X 軸和Y 軸坐標(biāo)、動(dòng)畫開始時(shí)在X 軸和Y 軸的縮放系數(shù)、動(dòng)畫結(jié)束時(shí)在X 軸和Y 軸的縮放系數(shù)、動(dòng)畫持續(xù)時(shí)間,動(dòng)畫縮放速度等屬性,實(shí)現(xiàn)圖片的縮放動(dòng)畫效果。此外還可以根據(jù)需求自行選擇創(chuàng)建alpha.xml、rotate.xml 和translate.xml 等文件實(shí)現(xiàn)透明度漸變、旋轉(zhuǎn)、平移動(dòng)畫效果。
(4)編寫界面交互代碼。通過(guò)調(diào)用AnimationUtils 類的loadAnimation()方法來(lái)加載步驟3 中定義補(bǔ)間動(dòng)畫效果的XML 文件。同時(shí)設(shè)置動(dòng)畫監(jiān)聽器,監(jiān)聽動(dòng)畫開始、結(jié)束和重復(fù)事件,在動(dòng)畫結(jié)束時(shí)進(jìn)行界面跳轉(zhuǎn),跳轉(zhuǎn)到記事本APP界面。最后通過(guò)startAnimation 方法啟動(dòng)動(dòng)畫。
界面交互代碼如下(以加載縮放動(dòng)畫效果為例):
(5)修改AndroidManifest.xml 文件,設(shè)置動(dòng)畫Activity為主啟動(dòng)項(xiàng)。
實(shí)現(xiàn)APP 開始動(dòng)畫設(shè)計(jì)思路如圖2 所示。縮放效果如圖3 所示。
圖3:開始?xì)g迎動(dòng)畫(縮放效果)
在記事本APP 中需要保存數(shù)據(jù)量大、結(jié)構(gòu)性復(fù)雜的筆記記錄數(shù)據(jù)。如果使用文件存儲(chǔ)或SharedPreferences存儲(chǔ)只能保存一些簡(jiǎn)單的數(shù)據(jù)和鍵值對(duì),文件存儲(chǔ)或SharedPreferences 存儲(chǔ)很難存儲(chǔ)大量復(fù)雜的關(guān)系型記錄數(shù)據(jù),為此采用Android 系統(tǒng)內(nèi)置的SQLite 數(shù)據(jù)庫(kù)。SQLite是由D.Richard Hipp 用C 語(yǔ)言開發(fā)的一款輕量級(jí)別的關(guān)系型數(shù)據(jù)庫(kù),只需很少的存儲(chǔ)空間而且響應(yīng)快速,一般只占用約220KB 的存儲(chǔ)空間,由于手機(jī)等設(shè)備存儲(chǔ)空間有限,所以選擇使用SQLite 數(shù)據(jù)庫(kù)非常合適。雖然SQLite 占用空間小,但它能使用SQL 語(yǔ)句在同一時(shí)間內(nèi)管理高達(dá)4TB 的數(shù)據(jù),并使用B‐Tree 存儲(chǔ)數(shù)據(jù)[5]8。SQLite 支持事務(wù)管理、視圖創(chuàng)建、內(nèi)外嵌套查詢、多重條件組合查詢、約束檢測(cè)和處理外鍵在內(nèi)的ANSI SQL92 標(biāo)準(zhǔn)大子集,且SQLite 的API 設(shè)計(jì)簡(jiǎn)單易懂,所以使用者可以很快學(xué)會(huì)使用SQLite。SQLite 具備小型、快速、簡(jiǎn)單、安全和高可靠等特點(diǎn),同時(shí)SQLite 不用配置、能夠單獨(dú)運(yùn)行、具備事務(wù)管理能力,是當(dāng)今世界上運(yùn)用最多的嵌入式SQL 數(shù)據(jù)庫(kù)引擎[5]8。在記事本APP 中使用了SQLite 這種功能強(qiáng)大的數(shù)據(jù)庫(kù),能夠顯著提升管理數(shù)據(jù)記錄的性能。
2.2.1 數(shù)據(jù)庫(kù)的創(chuàng)建
Android 系統(tǒng)中有一個(gè)SQLiteOpenHelper 類,通過(guò)SQLiteOpenHelper 類可以方便地對(duì)記事本APP 數(shù)據(jù)庫(kù)進(jìn)行創(chuàng)建和升級(jí)。由于SQLiteOpenHelper 是抽象類,要?jiǎng)?chuàng)建一個(gè)類去繼承SQLiteOpenHelper 類,并且重寫該類中的onCreate()方法和onUpgrade()方法。onCreate()方法是在記事本APP 數(shù)據(jù)庫(kù)第1 次創(chuàng)建時(shí)調(diào)用,該方法通常用于初始化表結(jié)構(gòu)。onUpgrade()方法在遇到未來(lái)記事本APP數(shù)據(jù)庫(kù)變更升級(jí)時(shí)通過(guò)增加數(shù)據(jù)庫(kù)版本號(hào)進(jìn)行調(diào)用,如果版本號(hào)不增加則該方法不調(diào)用。創(chuàng)建或打開一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)是通過(guò)SQLiteOpenHelper 的getReadableDatabase()和getWritableDatabase()兩個(gè)實(shí)例方法來(lái)實(shí)現(xiàn)的,這兩個(gè)實(shí)例方法都可以返回能實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫操作的對(duì)象。但getWritableDatabase()在數(shù)據(jù)庫(kù)不能寫入時(shí)會(huì)拋出異常,而getReadableDatabase()方法返回的對(duì)象能以只讀的方式打開數(shù)據(jù)庫(kù)[6]345。
2.2.2 數(shù)據(jù)的添加、修改、刪除操作
SQLiteOpenHelper 創(chuàng)建和升級(jí)數(shù)據(jù)庫(kù)是通過(guò)getReadableDatabase()或getWritableDatabase()方法實(shí)現(xiàn),而且會(huì)返回一個(gè)SQLiteDatabase 對(duì)象,通個(gè)這個(gè)對(duì)象可以對(duì)記事本記錄數(shù)據(jù)進(jìn)行添加、修改、刪除、查詢等操作[6]354。
在SQLiteDatabase 中有一個(gè)insert()方法,可用于在記事本APP 中添加數(shù)據(jù)。insert()方法接收3 個(gè)參數(shù):第一個(gè)參數(shù)是要添加記錄的記事本APP 數(shù)據(jù)表名稱。第二個(gè)參數(shù)用于在未指定添加數(shù)據(jù)的情況下給某些可以為空的列自動(dòng)賦值NULL。第三個(gè)參數(shù)為ContentValues 對(duì)象,ContentValues類相當(dāng)于Map 類,可以通過(guò)鍵值對(duì)的形式存入數(shù)據(jù),這里的key 表示插入數(shù)據(jù)的列名,value 表示要插入的數(shù)據(jù)。
在添加完數(shù)據(jù)后,如何才能修改記事本APP 表中已有的數(shù)據(jù)。SQLiteDatabase 中提供了一個(gè)十分好用的update()方法,這個(gè)方法是對(duì)記事本中的數(shù)據(jù)表記錄進(jìn)行更新。update()方法接收4 個(gè)參數(shù),第一個(gè)參數(shù)表示數(shù)據(jù)庫(kù)表的名稱,第二個(gè)參數(shù)是要更新的數(shù)據(jù)。第三個(gè)參數(shù)表示要更新修改數(shù)據(jù)的查詢條件。第四個(gè)參數(shù)表示查詢條件的參數(shù)。
SQLiteDatabase 中同樣也提供了delete 方法,專門用于刪除數(shù)據(jù)。delete()方法可接收3 個(gè)參數(shù),第一個(gè)參數(shù)是記事本APP 對(duì)應(yīng)數(shù)據(jù)庫(kù)的表名,第二、第三個(gè)參數(shù)用于指定刪除什么數(shù)據(jù),如果沒(méi)有指定則默認(rèn)會(huì)刪除對(duì)應(yīng)表中的所有數(shù)據(jù)[6]360。
2.2.3 數(shù)據(jù)的查詢操作
在記事本APP 中“增刪改”只是其中的一小部分功能,使用最多的功能就是查詢數(shù)據(jù),例如記事本的記錄列表查看和某一記錄筆記的詳細(xì)內(nèi)容查看,同時(shí)查詢數(shù)據(jù)也是比較復(fù)雜的一種操作。進(jìn)行數(shù)據(jù)查詢的時(shí)候使用的是SQLiteDatabase 提供的query()方法,該方法返回的是一個(gè)行數(shù)集合Cursor,Cursor 是一個(gè)游標(biāo)接口,提供遍歷查詢的方法。需要注意的是,使用完Curesor 對(duì)象后,需要及時(shí)關(guān)閉,否則會(huì)造成內(nèi)存泄露。query()方法包含7 個(gè)參數(shù),第1個(gè)參數(shù)表示記事本APP 表名稱,第2 個(gè)參數(shù)表示查詢的列名,第3 個(gè)參數(shù)表示的是接收查詢條件的子句,第4 個(gè)參數(shù)表示接收查詢子句對(duì)應(yīng)的條件值,第5 個(gè)參數(shù)表示分組方式,第6 個(gè)參數(shù)接收having 條件,第7 個(gè)參數(shù)表示排序方式[4]125,通過(guò)設(shè)定對(duì)應(yīng)字段的排序方式,可以輕松實(shí)現(xiàn)記事本記錄按ID 或編輯時(shí)間升序或降序展示。
2.3.1 WebView 控件訪問(wèn)互聯(lián)網(wǎng)資源
21世紀(jì)是互聯(lián)網(wǎng)的時(shí)代,如果記事本APP 不能夠利用互聯(lián)網(wǎng)資源,那么用戶一定會(huì)感到枯燥乏味。在記事本APP 中希望能夠展示一些百年黨史新聞網(wǎng)頁(yè)或黨史知識(shí)測(cè)試網(wǎng)頁(yè),但加載和顯示網(wǎng)頁(yè)通常是瀏覽器的任務(wù),如果在使用記事本APP 中需要用戶打開系統(tǒng)瀏覽器則會(huì)影響用戶體驗(yàn),開發(fā)人員自己去編寫瀏覽器則開發(fā)成本太高。筆者選擇采用WebView 來(lái)實(shí)現(xiàn)這一功能,WebView 控件不僅可以指定URL,還可以加載并執(zhí)行HTML 代碼,同時(shí)還能支持JavaScript,通過(guò)該控件可以輕松展示各種各樣的網(wǎng)頁(yè)。
WebView 類是由Android 系統(tǒng)中View 類擴(kuò)展而來(lái)的,可以將WebView 類添加到對(duì)應(yīng)的布局中,顯示特定的網(wǎng)頁(yè)內(nèi)容,WebView 不會(huì)顯示出地址欄或?qū)Ш綑冢怀尸F(xiàn)所需要的網(wǎng)頁(yè)內(nèi)容[7]11。通過(guò)WebView 的getSettings()方法可以設(shè)置一些瀏覽器的屬性,在記事本APP 中黨史知識(shí)測(cè)試H5 網(wǎng)頁(yè)需要支持JavaScript 腳本和使用localStorage,否則網(wǎng)頁(yè)無(wú)法正常顯示。因此調(diào)用setJavaScriptEnabled()方法和setDomStorageEnabled() 方法,讓W(xué)ebView 支持JavaScript腳本和DOM 緩存,程序代碼如下:
在記事本APP 中,遇到一個(gè)網(wǎng)頁(yè)變換到其他網(wǎng)頁(yè)時(shí),用戶希望不打開瀏覽器,仍然在當(dāng)前WebView 中顯示目標(biāo)網(wǎng)頁(yè),那么可以使用WebView 的setWebViewClient()方法,并傳遞一個(gè)WebViewClient 的實(shí)例。最后調(diào)用WebView 的loadUrl()方法,并將網(wǎng)址傳入,即可展示相應(yīng)的網(wǎng)頁(yè)內(nèi)容[6]507。
最后記事本APP 通過(guò)互聯(lián)網(wǎng)訪問(wèn)資源,需要在Android Manifest.xml 文件中加入網(wǎng)絡(luò)權(quán)限聲明[8]43,否則應(yīng)用程序會(huì)出現(xiàn)無(wú)法訪問(wèn)互聯(lián)網(wǎng)資源的情況。
2.3.2 Retrofit 框架實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)交互解析
此外,能源行業(yè)效益、效率獲得總體改善。前8個(gè)月,利潤(rùn)總額同比增長(zhǎng)25.1%,占工業(yè)企業(yè)的17.8%,比去年同期提高5個(gè)百分點(diǎn)。前三季度,全國(guó)發(fā)電設(shè)備利用率結(jié)束連續(xù)6年下降的局面,發(fā)電設(shè)備利用小時(shí)比去年同期增加94個(gè)小時(shí)。
WebView 控件能夠方便訪問(wèn)互聯(lián)網(wǎng)資源,但這種交互通常是單向的。如果記事本應(yīng)用中需要與后臺(tái)遠(yuǎn)程服務(wù)器進(jìn)行雙向交互通信,比如實(shí)現(xiàn)注冊(cè)、登錄和數(shù)據(jù)備份等功能,并且能夠?qū)⒎?wù)器返回的JSON 數(shù)據(jù)自動(dòng)解析成對(duì)象,這就需要用到Retrofit 網(wǎng)絡(luò)庫(kù)。Retrofit 是Square 公司在OkHttp 的基礎(chǔ)上進(jìn)一步開發(fā)出來(lái)的應(yīng)用層網(wǎng)絡(luò)通信庫(kù),能夠讓開發(fā)者以更加面向?qū)ο蟮乃季S進(jìn)行網(wǎng)絡(luò)操作。OkHttp 側(cè)重的是底層通信的實(shí)現(xiàn),Retrofit 側(cè)重上層接口的封裝,Retrofit 是當(dāng)前Android 開發(fā)中最流行的網(wǎng)絡(luò)請(qǐng)求框架。Android 應(yīng)用程序通過(guò)Retrofit 框架與遠(yuǎn)程服務(wù)器交互通信時(shí),Android 應(yīng)用程序首先向Retrofit 接口層提出網(wǎng)絡(luò)請(qǐng)求,Retrofit 封裝網(wǎng)絡(luò)請(qǐng)求頭部、網(wǎng)絡(luò)請(qǐng)求參數(shù)、Url 等信息,之后 OkHttp 處理后續(xù)的網(wǎng)絡(luò)請(qǐng)求,并從服務(wù)端獲得返回?cái)?shù)據(jù),OkHttp 將原始結(jié)果傳遞給Retrofit,Retrofit 根據(jù)之前設(shè)定好的格式進(jìn)行解析[9]9。
記事本APP 使用Retrofit 框架與遠(yuǎn)程服務(wù)器進(jìn)行交互通信的基本用法如下:
(1)添加軟件依賴包。在app/build.gradle 文件中添加Retrofit 所需要的依賴包,添加Retrofit 和Retrofit 轉(zhuǎn)換庫(kù)到dependencies 閉包中。由于Retrofit 是在OkHttp 的基礎(chǔ)上開發(fā)的,所以無(wú)需額外再添加OkHttp 庫(kù)。Retrofit 轉(zhuǎn)換庫(kù)使用GSON 解析JSON 數(shù)據(jù),因此不用再添加GSON 庫(kù)。
(2)創(chuàng)建實(shí)體類。從服務(wù)器端返回的數(shù)據(jù)經(jīng)過(guò)Retrofit轉(zhuǎn)換器轉(zhuǎn)換后為JSON 格式,需要?jiǎng)?chuàng)建對(duì)應(yīng)的實(shí)體類進(jìn)行接收。
(3)創(chuàng)建RetrofitUtil 工具類。在工具類里面定義基礎(chǔ)URL,定義Retrofit 對(duì)象和OkHttpClient 對(duì)象。在OkHttpClient 對(duì)象中設(shè)置連接超時(shí)參數(shù)和攔截器,并在攔截器中設(shè)置token 鑒權(quán)參數(shù)。設(shè)置好OkHttpClient 對(duì)象后作為參數(shù)傳入Retrofit 對(duì)象的client 屬性中,并根據(jù)需要設(shè)置Retrofit 對(duì)象的格式轉(zhuǎn)換器。最后將RetrofitUtil 設(shè)置成單例模式,生成唯一實(shí)例。
(5)封裝客戶端訪問(wèn)程序。創(chuàng)建RetrofitClient 類實(shí)現(xiàn)Retrofit 框架的Callback 接口并重寫onResponse 和onFailure方法。在對(duì)應(yīng)的構(gòu)造函數(shù)里面通過(guò)RetrofitUtil 實(shí)例傳入IService 接口實(shí)例,在RetrofitClient 類里面定義GET、POST、PUT 等方法,在方法里面?zhèn)魅險(xiǎn)RL、網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)等參數(shù),當(dāng)調(diào)用GET、POST 等方法時(shí)返回Call<>對(duì)象,再調(diào)用enqueue()方法,Retrofit 框架會(huì)發(fā)起網(wǎng)絡(luò)異步請(qǐng)求,服務(wù)器響應(yīng)的數(shù)據(jù)會(huì)在enqueue()方法中Callback 里面實(shí)現(xiàn)[10]83‐84。
通過(guò)Retrofit 框架可以方便實(shí)現(xiàn)與遠(yuǎn)程服務(wù)器進(jìn)行數(shù)據(jù)交互并對(duì)返回的數(shù)據(jù)進(jìn)行解析,能夠讓記事本APP 在互聯(lián)網(wǎng)時(shí)代更加智能。
本文分析和研究了實(shí)現(xiàn)智能記事本APP 開始?xì)g迎界面的思路、方法及關(guān)鍵代碼,使用縮放動(dòng)畫和透明度漸變動(dòng)畫實(shí)現(xiàn)APP 的開始?xì)g迎界面,分析通過(guò)SQLite 數(shù)據(jù)庫(kù)管理記事本APP 的記錄數(shù)據(jù),研究數(shù)據(jù)庫(kù)如何創(chuàng)建以及如何對(duì)數(shù)據(jù)進(jìn)行增刪查改操作,分析如何使用WebView 控件,實(shí)現(xiàn)訪問(wèn)百年黨史新聞、黨史知識(shí)測(cè)試等互聯(lián)網(wǎng)資源,使用Retrofit 網(wǎng)絡(luò)框架與遠(yuǎn)端服務(wù)器進(jìn)行交互解析,取得了較好的用戶體驗(yàn),其實(shí)現(xiàn)思路和方法也可適用于其他APP 開發(fā)。該智能記事本APP 不但可以幫助用戶便捷記錄生活、工作和學(xué)習(xí)中的諸多事情,幫助人們有條理地進(jìn)行時(shí)間管理,而且可以有助于用戶隨時(shí)隨地記錄下學(xué)習(xí)黨史的心得體會(huì),幫助用戶更好地學(xué)習(xí)黨史知識(shí)。