作者/周明韜,湖南省衡東縣第一中學(xué)
基于Android Studio的天氣預(yù)報(bào)APP設(shè)計(jì)與實(shí)現(xiàn)
作者/周明韜,湖南省衡東縣第一中學(xué)
隨著移動(dòng)互聯(lián)網(wǎng)的興起及Android機(jī)的普及,智能手機(jī)已經(jīng)成為人們?nèi)粘I钪斜乇瓤缮俚墓ぞ?。尤其?guó)產(chǎn)Android手機(jī)的發(fā)展快速迅猛,相比于蘋(píng)果手機(jī)有價(jià)格上的優(yōu)勢(shì),故市場(chǎng)潛力巨大。目前,手機(jī)的功能已經(jīng)不僅僅是打電話發(fā)短信,更多的是為我們的生活生產(chǎn)提供便利條件。以往人們不太方便獲取的信息,通過(guò)手機(jī)上網(wǎng)可以實(shí)時(shí)獲取。比如以往人們獲取天氣預(yù)報(bào)的方式多為收看電視節(jié)目或收聽(tīng)廣播,而智能手機(jī)的出現(xiàn)可以通過(guò)網(wǎng)絡(luò)更快更方便地獲取天氣信息。基于以上原因,本項(xiàng)目制作了一款界面簡(jiǎn)潔,操作簡(jiǎn)單的Android端天氣預(yù)報(bào)應(yīng)用。
Android;天氣預(yù)報(bào);APP開(kāi)發(fā);XML數(shù)據(jù)傳輸;Layout布局
天氣預(yù)報(bào)已經(jīng)成為人們生活不可缺少的一部分,隨著技術(shù)、需求、生活水平的發(fā)展,天氣信息已經(jīng)成為一個(gè)需要實(shí)時(shí)獲取的消息。在這樣的市場(chǎng)需求的基礎(chǔ)上,本人根據(jù)用戶(hù)需求設(shè)計(jì)出了具有查詢(xún)當(dāng)日天氣、溫度、風(fēng)力、污染情況、其他城市天氣情況等功能的天氣預(yù)報(bào)APP?;贏ndroid Studio開(kāi)發(fā),臺(tái)利用HttpClient獲取網(wǎng)絡(luò)得到天氣數(shù)據(jù),通過(guò)XML解析得到的溫度、濕度、風(fēng)力等具體值更新今日天氣UI界面數(shù)據(jù),從數(shù)據(jù)庫(kù)中讀取城市列表,通過(guò)ListView展示城市列表,搜索城市等。
天氣預(yù)報(bào)是人們?nèi)粘I罱?jīng)常關(guān)注的話題,隨著智能手機(jī)以及移動(dòng)互聯(lián)網(wǎng)的發(fā)展,天氣預(yù)報(bào)已經(jīng)可以從每天一獲取變成每小時(shí)一獲取,甚至實(shí)時(shí)獲取。在手機(jī)上使用移動(dòng)網(wǎng)絡(luò)時(shí)時(shí)獲取天氣預(yù)報(bào)可以為人們出行做必要準(zhǔn)備。
(1)對(duì)于天氣預(yù)報(bào)這種應(yīng)用,使用時(shí)段應(yīng)該為碎片化時(shí)間,使用時(shí)長(zhǎng)應(yīng)該盡量短,使用難度應(yīng)該盡量簡(jiǎn)單。
(2)定位當(dāng)前位置,自動(dòng)更新用戶(hù)所在城市的天氣信息,也可以查詢(xún)不同城市的天氣信息。
(3)查詢(xún)信息要包括:溫度、濕度、風(fēng)力、PM2.5。
(4)預(yù)測(cè)未來(lái)幾天的天氣情況并展示。
扁平化的設(shè)計(jì)風(fēng)格,畫(huà)面簡(jiǎn)潔明了,查詢(xún)天氣等重要功能放置首頁(yè),天氣信息采用文字和圖案結(jié)合的方式,陰晴用圖標(biāo)代替,溫度等重要信息相對(duì)于風(fēng)力、濕度要更加明顯。
軟件是基于Android平臺(tái)開(kāi)發(fā)的,主要有四大模塊:
(1)城市管理模塊:提供國(guó)內(nèi)城市的列表,用戶(hù)可根據(jù)首字母檢索、選擇。
(2)天氣管理模塊:用戶(hù)可以查詢(xún)當(dāng)日的天氣信息和未來(lái)七日天氣信息,包括時(shí)、地點(diǎn)、氣溫、濕度、污染情況等。
(3)地理位置模塊:定位用戶(hù)當(dāng)前城市位置,并顯示相應(yīng)天氣。
(4)設(shè)置模塊:包括用戶(hù)個(gè)人偏好,分享天氣信息,關(guān)于本軟件等。
Layout 是一類(lèi)特殊的控件,其本身并不顯示詳細(xì)內(nèi)容,主要用途是為了控制其子控件的布局。例如LinearLayout(線性布局),可將子控件按垂直或水平方向按順序排列下去;Tablelayout(表格布局),可以將子控件像表格一樣,一個(gè)個(gè)放置好;Relative—layout(相對(duì)布局)更靈活,可以設(shè)定各個(gè)控件之間的對(duì)齊和排列關(guān)系,適合定制復(fù)雜的界面。布局控件還可以嵌套使用,構(gòu)建出更復(fù)雜美觀的界面。
這里采用嵌套布局的方式,放置一個(gè)線性布局,采用垂直方式分布,分別放置今日天氣、7日天氣信息以及廣告信息,并指定背景圖片,代碼如下。
android:id=”@+id/weather_today” android:layout_width=”f i ll_parent” android:layout_height=”wrap_content” android:padding=”10.0dip”>
常用控件有:TextView,Button,Toast, ImageView等,其中TextView是用于在界面上顯示一段文字信息,代碼如下。layout_width與layout_height分別指定控件的寬度和高度(所有控件通用),match_parent:控件大小與父布局一致,f i ll_parent:API level 8以后被match_parent取代,wrap_content:控件大小剛好包含里面的內(nèi)容,大小由內(nèi)容決定, text:指定控件文本,gravity:指定控件內(nèi)文字的對(duì)齊方式,可以用“|”指定多個(gè)值,textColor:指定文字的顏色,textSize:指定文字的大小,id:為控件設(shè)置一個(gè)id(非必須)。
android:id=”@+id/city” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:layout_alignParentLeft=”true” android:layout_alignParentTop=”true” android:layout_marginLeft=”15.0dip” android:singleLine=”true” android:text=”北京” android:textSize=”40.0sp” /> 獲取網(wǎng)絡(luò)數(shù)據(jù)的方式有三種:WebView控件、HttpURLConnection、HttpClient。 其 中,HttpClient相比傳統(tǒng)JDK自帶的URLConnection更加靈活和易用。它不僅使客戶(hù)端發(fā)送Http請(qǐng)求變得相對(duì)容易,而且也為開(kāi)發(fā)人員測(cè)試基于Http的接口提供方便,提高開(kāi)發(fā)的效率,從而提高代碼的魯棒性[1]。 HttpClient的使用方法:作為一個(gè)接口,HttpClient在使用中需要首先進(jìn)行實(shí)例化,因此第一步是要?jiǎng)?chuàng)建一個(gè)DefaultHttpClient實(shí)例;根據(jù)要發(fā)送的請(qǐng)求是GET請(qǐng)求或POST請(qǐng)求,創(chuàng)建一個(gè)HttpGet對(duì)象或HttpPost對(duì)象;以POST請(qǐng)求為例,通過(guò)HttpPost的SetEntity()方法傳入構(gòu)造好的UrlEncodedFormEntity;然后使用HttpClient對(duì)象的execute()方法向服務(wù)器發(fā)送請(qǐng)求;再獲取該方法返回的HttpResponse對(duì)象的HttpEntity對(duì)象,可使用HttpResponse的getEntity()方法獲取;另外,可以通過(guò)HttpResponse的getStatusLine().getStatusCode()方法獲取返回狀態(tài)碼,來(lái)確定是否成功,200代表成功。 在網(wǎng)絡(luò)上傳輸數(shù)據(jù)時(shí)最常用的格式有兩種:XML和JSON,均是通用數(shù)據(jù)交換格式.。JSON的主要優(yōu)勢(shì)是體積小。解析XML文件數(shù)據(jù):在Android平臺(tái)上可以使用Simple API for XML(SAX) 、Document Object Model(DOM和Android附帶的Pull解析器解析XML文件[2]。我們使用pull解析器,Pull解析器的使用:讀取到xml的聲明返回 START_DOCUMENT;讀取到xml的結(jié)束返回 END_DOCUMENT;讀取到xml的開(kāi)始標(biāo)簽返回 START_TAG;讀取到xml的結(jié)束標(biāo)簽返回 END_TAG[3]。代碼如下: XmlPullParserFactoryfac = XmlPullParserFactory newI nstance(); XmlPullParserxpParser = fac.newPullParser(); xpParser.setInput(new StringReader(xmldata)); inteType = xpParser.getEventType(); //不斷讀取元素 while (eType != XmlPullParser.END_DOCUMENT) { switch (eType) { // 當(dāng)讀到文檔開(kāi)始標(biāo)簽的時(shí)候 case XmlPullParser.START_DOCUMENT: break; // 當(dāng)讀到標(biāo)簽元素開(kāi)始標(biāo)簽的時(shí)候 case XmlPullParser.START_TAG: if (xpParser.getName().equals(“city”)) { eType = xpParser.next(); Log.d(“mWeatherLog”, “city: “+xpParser getText()); } …… // 當(dāng)讀到標(biāo)簽元素結(jié)束標(biāo)簽的時(shí)候 case XmlPullParser.END_TAG: break; } // 繼續(xù)讀取下一個(gè)元素 eType = xpParser.next(); } Android系統(tǒng)中內(nèi)置的數(shù)據(jù)庫(kù)為SQLite,一種輕量級(jí)關(guān)系型數(shù)據(jù)庫(kù),占用資源小,大概只需幾百K內(nèi)存,特別適合在嵌入式系統(tǒng)中使用,支持標(biāo)準(zhǔn)的SQL語(yǔ)法,支持事務(wù)機(jī)制,SQLiteOpenHelper類(lèi)是Android專(zhuān)門(mén)為開(kāi)發(fā)者提供的用于對(duì)SQLite數(shù)據(jù)庫(kù)進(jìn)行操作的類(lèi)[4]。利用SQLiteDatabase對(duì)象可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行CRUD操作。類(lèi)中的公共函數(shù):insert()、delete()、 update()、 query()。封裝了執(zhí)行的添加、刪除、更新和查詢(xún)功能的SQL命令。 本軟件的城市數(shù)據(jù)庫(kù)設(shè)計(jì)如圖3.1主要包括:城市id,省份,城市名(區(qū)名),編碼,拼音,首字母,縮寫(xiě)字母。為后續(xù)查找城市功能的實(shí)現(xiàn)。 圖1 city數(shù)據(jù)庫(kù)設(shè)計(jì) 作為一款操作系統(tǒng),必須支持多線程操作,在Android系統(tǒng)中,主線程和子線程分別有不同的作用,這樣分工明確有利于系統(tǒng)分配硬件資源,提高系統(tǒng)性能。其中,主線程(MainThread)主要負(fù)責(zé)處理與UI相關(guān)的事件,例如:KeyPressed事件,ScreenTouched事件,Draw事件等。主線程把這些和UI相關(guān)的事件分發(fā)到相對(duì)應(yīng)的組件中進(jìn)行處理。所以主線程通常也被叫做UI線程。子線程主要負(fù)責(zé)除UI相關(guān)事件之外的事件,通常這些事件耗時(shí)較長(zhǎng),例如聯(lián)網(wǎng)下載數(shù)據(jù),訪問(wèn)數(shù)據(jù)庫(kù)查找數(shù)據(jù)等[5]。代碼如下: //為主線程增加Handler: mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0: labelTimer.setText(“已經(jīng)過(guò) “ + msg.obj + “ 秒”); } } }; //在子線程的循環(huán)體中增加如下語(yǔ)句: Message msg = new Message(); msg.obj = timer; msg.what = 0; mHandler.sendMessage(msg); 一個(gè)系統(tǒng)或應(yīng)用從開(kāi)始開(kāi)發(fā)到最終發(fā)布要經(jīng)過(guò)大量的測(cè)試,測(cè)試可以幫助程序員找出開(kāi)發(fā)中的疏漏,幫助產(chǎn)品經(jīng)理發(fā)現(xiàn)用戶(hù)體驗(yàn)提升的空間,對(duì)于發(fā)布一款產(chǎn)品來(lái)說(shuō)非常重要。本程序是基于AndroidStudio平臺(tái)開(kāi)發(fā)的應(yīng)用,在編寫(xiě)完成程序之后,選擇AndroidStudio主界面上的Run菜單,然后在下拉菜單中選中RunApp項(xiàng),即可開(kāi)始測(cè)試項(xiàng)目[6]。此外,我們將文件打包成.apk文件傳輸?shù)绞謾C(jī)并完成安裝和運(yùn)行,測(cè)試結(jié)果如圖2。 圖2 測(cè)試用例圖 綜上所述天氣預(yù)報(bào)系統(tǒng)所有預(yù)期功能都完整地實(shí)現(xiàn),并且達(dá)到了預(yù)期的運(yùn)行效果。Android平臺(tái)的兼容性和開(kāi)放性極強(qiáng),本文講述了開(kāi)發(fā)思路并具體實(shí)現(xiàn)了在安卓平臺(tái)上開(kāi)發(fā)一款查看實(shí)時(shí)和未來(lái)天氣的天氣預(yù)報(bào)軟件,在實(shí)際的測(cè)試中成功運(yùn)行Android平臺(tái)正在不斷的發(fā)展,我們需要在日后的工作中不斷探索和實(shí)踐,以建立更實(shí)用的天氣預(yù)報(bào)軟件。 當(dāng)然,本軟件還有很多功能可以改進(jìn)和創(chuàng)新,大多數(shù)天氣預(yù)報(bào)app只注重顯示天氣的功能,沒(méi)有對(duì)用戶(hù)的數(shù)據(jù)進(jìn)一步分析利用,未來(lái)可以對(duì)用戶(hù)每日天氣情況、位置進(jìn)行收集,增加更加人性的功能。如:一周的天氣情況,通過(guò)折線圖等方式形象的展示出來(lái);評(píng)選出最佳天氣周,在天氣好得時(shí)候推送旅游線路;用戶(hù)界面也可以隨著天氣情況來(lái)改變,污染嚴(yán)重的時(shí)候是黑色,天氣好得時(shí)候是藍(lán)色等。使用戶(hù)交互更加友好,這也是我日后需要不斷完善的方向。 * [1] Burnette Ed著,張波,高朝勤,楊選等譯.Android 基礎(chǔ)教程[M].人民郵電出版社,2009. * [2] 張利國(guó),代聞,龔海平編著.Android 移動(dòng)開(kāi)發(fā)案例詳解[M].人民郵電出版社,2010. * [3] 劉平.Android 手機(jī)訪問(wèn)服務(wù)器的一種數(shù)據(jù)交互方法[J].電子設(shè)計(jì)工程,2010.18(9). * [4] 王向輝,張國(guó)印,陳潔.Android 應(yīng)用程序開(kāi)發(fā)[M].清華大學(xué)出版社,2010. * [5]Xia-huaMeng,Ye-xiangOu.A Solution for Application Transpl antation from J2ME to Android[J].2010 Intemational Conferen ce on Future Information Technology and Management Engin eering,2010,10:60-63. * [6] 楊苗. 基于安卓手機(jī)平臺(tái)的移動(dòng)旅游信息系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)[D]. 長(zhǎng)沙:湖南大學(xué)碩士學(xué)位論文, 2013.3.系統(tǒng)實(shí)現(xiàn)
■3.1 通過(guò)HTTP協(xié)議訪問(wèn)數(shù)據(jù)
■3.2 解析網(wǎng)絡(luò)數(shù)據(jù)
■3.3 SQLite數(shù)據(jù)庫(kù)設(shè)計(jì)
■3.4 Android中的多線程
4.測(cè)試
5.結(jié)論