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