張夢(mèng)妮+趙玲+杜嵐+姜楓+申靜波
摘要:該文充分分析了大學(xué)生學(xué)習(xí)現(xiàn)狀,并在Android平臺(tái)下設(shè)計(jì)了一個(gè)軟件“問(wèn)知網(wǎng)”,幫助大學(xué)生學(xué)習(xí)。并對(duì)該軟件平臺(tái)設(shè)計(jì)、實(shí)現(xiàn)功能、數(shù)據(jù)庫(kù)設(shè)計(jì)思想等進(jìn)行了詳細(xì)說(shuō)明。該軟件應(yīng)用了第三方框架,網(wǎng)絡(luò)包括OKHTTP框架、Glide框架。數(shù)據(jù)傳輸格式為Json,使用Gson框架解析其內(nèi)容。Android控件方面使用了大量自主開(kāi)發(fā)的控件,用以適應(yīng)需求。在整個(gè)圖片緩存方面,使用了自主開(kāi)發(fā)的圖片緩存框架,以緩存和壓縮的思想對(duì)圖片進(jìn)行了處理,用以節(jié)約內(nèi)存。該軟件開(kāi)發(fā)出來(lái)后為大學(xué)生提供了良好的學(xué)習(xí)平臺(tái)。
關(guān)鍵詞:Android平臺(tái);在線學(xué)習(xí);應(yīng)用程序
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)02-0049-04
Design and Implementation of “Ask Will Know”Based on Android Platform
ZHANG Meng-ni; ZHAO Ling; DU Lan; JIANG Feng; SHEN Jing-bo
(College of Computer and Information Technology , Northeast Petroleum University, Daqing 163000, China)
Abstract: This paper analyzed the current situation of college students learning and introduced the process about designing a software named "Ask Will Know" on Android platform to help students learn. This paper also gave an instruction on Platform design, implementation of functions and database design ideas in detail. "Ask Will Know" used a third-party framework that includes the OKHTTP framework and the Glide framework. Data formatted as Json, using the Gson framework to parse its contents. The software used a lot of self-developed controls to meet the demand. In terms of the entire image cache, the reason why using self-developed picture cache framework and the idea of using cache and compression to handle image was to save memory. When the application got developed , it provides a good learning platform for College Students.
Key words: Android platform; learning online; application
1 背景
隨著網(wǎng)絡(luò)世界的飛速發(fā)展,手機(jī),ipad等手持移動(dòng)智能端日漸普及,學(xué)生獲取學(xué)習(xí)資源更加方便,獲取途徑也變得越發(fā)廣泛。以互聯(lián)網(wǎng)應(yīng)用為主要代表的網(wǎng) 絡(luò)和信息技術(shù)支持下的應(yīng)用與服務(wù)已經(jīng)深入到社會(huì)生活的方方面面,正在深刻 改變著經(jīng)濟(jì)和社會(huì)的組織方式和發(fā)展方向[1] 。社交網(wǎng)絡(luò)服務(wù)SNS(Social Network Service)[2]的流行使得大量移動(dòng)APP涌現(xiàn)。近幾年,一類幫助中小學(xué)生解決課后習(xí)題以及作業(yè)的軟件出現(xiàn),獲得了其所面向?qū)W生的極力追捧?,F(xiàn)有的軟件都僅是針對(duì)中小學(xué)生,但有現(xiàn)象顯示,目前大部分的在校大學(xué)生也存在著上課效率低下,課后習(xí)題無(wú)法獨(dú)自解決的問(wèn)題。由此可見(jiàn),大學(xué)生也需要一款專門面向他們的軟件,解決習(xí)題難題,鞏固課程知識(shí)。
本文描述了如何在Android平臺(tái)上采用三層架構(gòu),將系統(tǒng)的界面及業(yè)務(wù)數(shù)據(jù)分離來(lái)更方便地進(jìn)行軟件的設(shè)計(jì)與開(kāi)發(fā),搭建一個(gè)學(xué)生的在線學(xué)習(xí)平臺(tái),幫助大學(xué)生更好的進(jìn)行課后學(xué)習(xí)。
2 Android系統(tǒng)簡(jiǎn)介
Android 軟件平臺(tái)主要由五部分構(gòu)成,它們分別是:關(guān)鍵應(yīng)用程序、應(yīng)用程序框架和組件、C/C ++ 函數(shù)庫(kù)、Java 程序運(yùn)行環(huán)境、優(yōu)化了的 Linux 內(nèi)核[3]。Android系統(tǒng)是一個(gè)巨大的平臺(tái),由于應(yīng)用的日益豐富,使得終端用戶不斷地發(fā)展和壯大,越來(lái)越多的設(shè)計(jì)研究和開(kāi)發(fā)都在Android平臺(tái)上進(jìn)行[4],各個(gè)公司都可更改它的源代碼來(lái)體現(xiàn)自己的產(chǎn)品特色。也因?yàn)槿绱耍?017年Android的市場(chǎng)占有率達(dá)到了80%。同時(shí),它的開(kāi)源導(dǎo)致了Android的應(yīng)用千變?nèi)f化,可擴(kuò)展性極強(qiáng)。在Android5.0之后,Google提出了Metial Design,并提供了大量的控件。 “問(wèn)知網(wǎng)”正是使用了這樣的設(shè)計(jì)思路并運(yùn)用了最新的Android技術(shù),這些新特性使“問(wèn)知網(wǎng)”的流暢水平達(dá)到了一個(gè)新的高度。
3 數(shù)據(jù)庫(kù)設(shè)計(jì)思想
對(duì)已創(chuàng)建的數(shù)據(jù)庫(kù)和庫(kù)中的表,應(yīng)用程序在運(yùn)行過(guò)程中能對(duì)表的內(nèi)容進(jìn)行增、刪、改、查詢、統(tǒng)計(jì)、打印等操作[5]。數(shù)據(jù)庫(kù)系統(tǒng)的設(shè)計(jì)使用了E-R關(guān)系圖輔助整個(gè)數(shù)據(jù)庫(kù)的設(shè)計(jì)。根據(jù)功能,該平臺(tái)的數(shù)據(jù)庫(kù)的設(shè)計(jì)思路是:用戶基本信息表、試題集分類表、試題集信息表、基本題目信息表、用戶題目關(guān)聯(lián)表、視頻直播表以及歷史視頻表。endprint
用戶在直播時(shí)需要將自己的ID號(hào)作為直播的關(guān)聯(lián)信息,因此用戶基本信息表的設(shè)計(jì)如表1所示:
在程序中查詢數(shù)據(jù)關(guān)系里的數(shù)據(jù)時(shí),可通過(guò)試題集的ID找到關(guān)聯(lián)的基本題目,然后將這些數(shù)據(jù)通過(guò)json字符串返回給移動(dòng)端。
用戶有時(shí)還需查看自己的歷史題目,因此還需一張表來(lái)維護(hù)相關(guān)的數(shù)據(jù),如表5所示:
最終通過(guò)數(shù)據(jù)處理得出一種高效數(shù)據(jù)操作方式,提高Android平臺(tái)下數(shù)據(jù)庫(kù)的使用效率[6]。
4 平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)
4.1 平臺(tái)界面
界面底部是RadioGroup,內(nèi)部包含五個(gè)RadioButton,用于用戶選擇頁(yè)面。向上是一個(gè)自定義ViewPager,用于填裝五個(gè)Fragment。頂部是一個(gè)ToolBar,為Android中的導(dǎo)航頭部。UI層代碼實(shí)現(xiàn)相關(guān)的UI層接口,這些接口會(huì)在業(yè)務(wù)邏輯層中被調(diào)用,換句話說(shuō),只要UI層實(shí)現(xiàn)了這些接口,不管是什么樣的UI層代碼,業(yè)務(wù)邏輯層的代碼都不會(huì)發(fā)生改變。一個(gè)UI層中的列表適配器代碼一般都會(huì)達(dá)到上百行,如果再將業(yè)務(wù)邏輯放入此處,那么這里的代碼就會(huì)變得極其臃腫。因此整個(gè)軟件采用了MVP三層架構(gòu),將UI,業(yè)務(wù)邏輯,數(shù)據(jù)訪問(wèn)三者分離開(kāi)來(lái),使得整個(gè)項(xiàng)目的層次特別清晰[7]。
4.2 平臺(tái)實(shí)現(xiàn)的主要功能
1)用戶在平臺(tái)注冊(cè)并登陸后,可選擇記住密碼方便下次登錄。本平臺(tái)還提供找回密碼的功能。
2) 本平臺(tái)提供用戶提問(wèn)的功能。通過(guò)拍照將自己的題目上傳至平臺(tái),再對(duì)問(wèn)題進(jìn)行描述,發(fā)布后便可等待其他用戶回答了。相應(yīng)的,用戶也可以回答其他用戶的問(wèn)題,以此來(lái)賺取積分參與活動(dòng)。
3) 本平臺(tái)支持用戶在線練習(xí)。選擇對(duì)應(yīng)的課程后,用戶便可點(diǎn)擊開(kāi)始練習(xí)來(lái)鞏固知識(shí)了。
4) 本平臺(tái)為用戶提供收集錯(cuò)題的功能。以往在線練習(xí)遇到的錯(cuò)題都會(huì)以詳細(xì)的解釋出現(xiàn)在錯(cuò)題本里。用戶還可對(duì)錯(cuò)題本進(jìn)行增刪改等操作。
5) 本平臺(tái)支持教師用戶上傳自己的教學(xué)視頻,將同學(xué)們上課沒(méi)聽(tīng)懂的知識(shí)點(diǎn)復(fù)述一遍,幫助學(xué)生消化吸收。
6) 本平臺(tái)支持直播功能。無(wú)須空教室以及大量時(shí)間,教師可在課后為同學(xué)們直播答疑,給大家?guī)?lái)方便。
7) 本平臺(tái)在主界面會(huì)實(shí)時(shí)更新一些關(guān)于考研的動(dòng)態(tài)以及新聞,給要考研的學(xué)生們提供更多信息以作參考。
4.3 平臺(tái)架構(gòu)圖
4.4 平臺(tái)的實(shí)現(xiàn)
1) “問(wèn)知網(wǎng)”設(shè)計(jì)為“客戶端—服務(wù)端—數(shù)據(jù)層”三層結(jié)構(gòu)模式[8] 。登錄注冊(cè)使用騰訊云作為后臺(tái),方便為直播服務(wù)提供用戶數(shù)據(jù)。實(shí)現(xiàn)通過(guò)將用戶在文本框中的字符串提取出來(lái)并經(jīng)過(guò)一定的業(yè)務(wù)邏輯判斷,然后將其封裝成為Json字符串格式。通過(guò)OKHTTP框架以post方式將其提交給服務(wù)器具體的業(yè)務(wù)邏輯為:
String username =getContentFromEditeText(et_username);
String psd =getContentFromEditeText(et_psd);
String userFormJson =GsonUtils.createUser(username,psd);
Int state=MyHttpUtils.login(userForm);
if(state==SUCCESS){
showContentView();
}else{
showErroInfor();
}
通過(guò)getContentFromEditeText(et_username)方法可以獲取et_username中的內(nèi)容,通過(guò)GsonUtils.createUser(username,psd)可以封裝出相關(guān)的Json字符串;通過(guò)MyHttpUtils.login(userForm)可以將相關(guān)的內(nèi)容提交給服務(wù)器,并獲取返回碼,其內(nèi)部封裝了OkHttp框架的相關(guān)流程。
2) 用戶題目的上傳和登錄的流程一樣,不過(guò)此處上傳還包含了圖片,為了節(jié)省用戶流量,APP先使用Android中的BitmapFactory對(duì)圖片縮放30%,然后再將圖片通過(guò)OkHttp框架傳到服務(wù)器中。圖片的壓縮業(yè)務(wù)邏輯為:
BitmapFactory.Options newOpts = new BitmapFactory.Options();
newOpts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
newOpts.inJustDecodeBounds = false;
newOpts.inSampleSize = calculateRadio(bitmap);
bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
在以上的操作中,srcPath是上傳圖片的路徑,先讀取圖片的基本信息,這里的關(guān)注點(diǎn)是大小,然后根據(jù)圖片的大小設(shè)置其壓縮比例,再將壓縮后的圖片提取出來(lái)得到新的圖片。
3) 題目的練習(xí)功能
當(dāng)用戶點(diǎn)擊進(jìn)入該模塊時(shí),首先判斷用戶是否登錄,若未登錄則進(jìn)入登錄頁(yè)面,反之直接進(jìn)入可選題目列表。列表使用了最新的RecyclerView作為題目的列表控件,并結(jié)合其特點(diǎn)封裝了分頁(yè)功能。
移動(dòng)端先通過(guò)OKHTTP框架請(qǐng)求服務(wù)器,服務(wù)器再以Json的格式將數(shù)據(jù)返回給移動(dòng)端。然后移動(dòng)端對(duì)RecyclerView進(jìn)行數(shù)據(jù)適配,數(shù)據(jù)適配使用了適配器設(shè)計(jì)模式,其工作模式可以使用下面的代碼概括:endprint
Class ListAdater extends BaseAdater{
Int getItemCount();
View createView();
Object getItem();
void onBindView(Bean b);
}
getItemCount()方法可獲取列表長(zhǎng)度,createView可創(chuàng)建先關(guān)控件,getItem獲取相關(guān)數(shù)據(jù)源,onBindView將數(shù)據(jù)源和控件連接起來(lái)。這個(gè)適配器結(jié)合著數(shù)據(jù),就可以將題目顯示到頁(yè)面上了。
當(dāng)用戶提交答案時(shí),服務(wù)器端的Web程序會(huì)比對(duì)數(shù)據(jù)庫(kù)中的正確答案,并將統(tǒng)計(jì)結(jié)果保存到用戶的練習(xí)結(jié)果表中,同時(shí)將統(tǒng)計(jì)結(jié)果返回給移動(dòng)端,移動(dòng)端接受到統(tǒng)計(jì)結(jié)果時(shí),將數(shù)據(jù)展示給用戶。整個(gè)頁(yè)面使用ConstraintLayout作為根布局,沒(méi)有布局的重疊,性能相當(dāng)良好。
4) 用戶的錯(cuò)題本功能。由上述功能可知,在用戶練習(xí)時(shí),服務(wù)器便將相關(guān)統(tǒng)計(jì)數(shù)據(jù)放入了數(shù)據(jù)庫(kù)中,由于本文的重點(diǎn)是移動(dòng)端的開(kāi)發(fā),因此不贅述相關(guān)數(shù)據(jù)元的設(shè)計(jì)。這里的開(kāi)發(fā)與練習(xí)功能相似,都是使用了RecylerView作為列表。
5) 視頻流的使用?!皢?wèn)知網(wǎng)”使用騰訊云作為自己的視頻推流后臺(tái),使用RTMP協(xié)議進(jìn)行推流,在移動(dòng)端使用騰訊云提供的TXLivePlayer播放直播視頻。該控件的使用類似于Android原生態(tài)中的MediaPlayer,對(duì)視頻的播放操作做了很多優(yōu)秀的封裝。這個(gè)控件的使用過(guò)程的代碼描述為:
mTXCloudVideoView=obtainView(R.id.tx_live_view);
mTXLivePlayer = new TXLivePlayer(this);
mTXLivePlayer.setPlayListener(new MyITXLivePlayListener()
mTXLivePlayer.setPlayerView(mTXCloudVideoView);
mPlayUrl = getIntent().getStringExtra(Constants.PLAY_URL);
if (mPlayUrl != null)
mTXLivePlayer.startPlay(mPlayUrl);
從布局文件中獲取控件mTXCloudVideoView,之后創(chuàng)建TXLivePlayer對(duì)象mTXLivePlayer,然后為mTXLivePlayer配置監(jiān)聽(tīng)器,在監(jiān)聽(tīng)器中主要監(jiān)聽(tīng)了視頻接入成功的時(shí)刻和失敗的時(shí)刻,在失敗時(shí)彈出提示的對(duì)話框,成功則將視頻流接入。然后獲取視頻播放的URL,通過(guò)URL接入到先關(guān)的視頻流。
6) 歷史視頻。這里使用的是FLV協(xié)議,同時(shí)也是FLV格式,在這一部分中也同樣使用了騰訊云提供的視頻流,控件的使用與直播功能大同小異。
7) 動(dòng)態(tài)消息推送功能。使用騰訊云提供的消息推送功能,定期將相關(guān)的廣告鏈接推送給移動(dòng)端,移動(dòng)端接收到之后,會(huì)彈出Notification彈框,點(diǎn)擊之后進(jìn)入相關(guān)的網(wǎng)頁(yè),這利用了網(wǎng)頁(yè)的后臺(tái)可以隨時(shí)修改的特點(diǎn)。網(wǎng)頁(yè)使用WebView進(jìn)行加載,同時(shí)使用了其javascript接口監(jiān)聽(tīng)了相關(guān)的圖片,在js中將所有圖片的URL提取出來(lái)形成一個(gè)列表,然后以List的形式返回給Android。
4.5 圖片緩存
在APP中瀏覽圖片會(huì)消耗較多流量,影響加載速度,因此較多APP選擇先向用戶展示縮略圖,根據(jù)用戶需求再加載原圖[9]。如圖3所示:
在Android中,框架為開(kāi)發(fā)者提供了LruCache管理相關(guān)的緩存,而在圖片加載時(shí)的思想可由圖4所示:
通過(guò)URL訪問(wèn)cache,如果命中,直接拿出圖片,否則直接訪問(wèn)服務(wù)器,獲取圖片并壓縮,然后將其URL和壓縮后的圖片以鍵值對(duì)的形式存放到緩存中。
5 結(jié)束語(yǔ)
“問(wèn)知網(wǎng)”是應(yīng)各種需求而產(chǎn)生的新型學(xué)習(xí)平臺(tái)。Android 手機(jī)應(yīng)用程序開(kāi)發(fā)是一項(xiàng)復(fù)雜的工程,本文研究了在 Android 系統(tǒng)下,基于MVP架構(gòu)使用Java 語(yǔ)言設(shè)計(jì)和開(kāi)發(fā)軟件?!皢?wèn)知網(wǎng)”的開(kāi)發(fā)與應(yīng)用,為實(shí)現(xiàn)“隨時(shí)、隨地、隨身”學(xué)習(xí)搭建了良好的學(xué)習(xí)平臺(tái),對(duì)于打造學(xué)習(xí)型社會(huì)、構(gòu)建終身學(xué)習(xí)體系[10]具有重要的現(xiàn)實(shí)意義。驗(yàn)證了該平臺(tái)良好的實(shí)用性,也為廣大的 Android 開(kāi)發(fā)者提供一個(gè)參考。
參考文獻(xiàn):
[1] 王宇, 吳煒鑫, 王興偉. “互聯(lián)網(wǎng)+”下高校信息化建設(shè)模式的探索與研究[J]. 計(jì)算機(jī)應(yīng)用與軟件, 2016, 33(11):41-45.
[2] 喬秀全, 楊春, 李曉峰, 等. 社交網(wǎng)絡(luò)服務(wù)中一種基于用戶上下的信任度計(jì)算方法[J].計(jì)算機(jī)學(xué)報(bào), 2011, 34(12):2403-2413.
[3] 劉榮華, 張揚(yáng), 聶頌, 等. Oracle 數(shù)據(jù)庫(kù)管理與應(yīng)用系統(tǒng)開(kāi)發(fā)[M]. 北京: 人民郵電出版社, 2005.
[4] 桑楠, 趙麗, 郭文生. 多核平臺(tái)嵌入式瀏覽器并行機(jī)制的研究與設(shè)計(jì)[J]. 電子科技大學(xué)學(xué)報(bào), 2014, 4(43):400-404.
[5] 曹計(jì)昌, 楊月芹. PowerBuilder應(yīng)用程序在SQL Anywhere數(shù)據(jù)庫(kù)中動(dòng)態(tài)創(chuàng)建表的方法[J]. 微型機(jī)與應(yīng)用, 2001, 20(10):53-54.
[6] 周巍. Android平臺(tái)下基于SQLite數(shù)據(jù)庫(kù)的手機(jī)游戲設(shè)計(jì)與研究[D]. 昆明: 昆明理工大學(xué), 2011.
[7] 溫昱. 一線架構(gòu)師實(shí)踐指南[M]. 北京: 電子工業(yè)出版社, 2009.
[8] 熊水柔. 基于Android系統(tǒng)的移動(dòng)學(xué)習(xí)平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 北京: 北京郵電大學(xué)碩士論文, 2012.
[9] 王菁, 牛利杰. 面向移動(dòng)端基于社交關(guān)系的圖片緩存替換算法[J]. 計(jì)算機(jī)工程與科學(xué), 2017, 39(2):267-274.
[10] 盛建榮. 開(kāi)放大學(xué)背景下基層電大移動(dòng)學(xué)習(xí)平臺(tái)構(gòu)建研究——以金華“掌上電大”平臺(tái)開(kāi)發(fā)為例[J]. 中國(guó)遠(yuǎn)程教育: 綜合版, 2014(13):83-88.endprint