天氣客戶端開發報告
1 系統需求分析
1.1功能性需求分析
天氣預報客戶端,最基本就是為用戶提供准確的天氣預報信息。天氣查詢結果有兩種:一種是當天天氣信息,信息結果比較詳細,除溫度、天氣狀況外還可以提示穿衣建議、濕度、風向等信息,這樣使天氣信息更加完善;一種是未來幾天天氣預報信息,提供未來幾天的天氣狀況,方便用戶的出行預判。
1.2性能需求分析
為了保證客戶端能夠長期、安全、穩定、可靠、高效的運行,天氣客戶端應該滿足以下的性能需求:
1)系統處理的准確性和及時性
2)系統的開放性和系統的可擴充性
3)系統的易用性和易維護性
4)系統的資源低消耗性
2 系統設計
2.1界面架構
結合用戶查詢習慣,在主界面我們可以提供兩種查詢方法:
1.輸入查詢:
在城市輸入欄中輸入所需查詢城市的名字,點擊查詢按鈕即可顯示出天氣信息。
2.選擇查詢:
針對常見大中型城市,如北京、上海等,為方便用戶查詢,只要在預設城市的下拉欄中尋找用戶所查找城市,點擊查詢按鈕即可顯示出天氣信息。
用Axure RP 畫出的界面設計圖如下:
2.2系統模塊
整個系統由四個模塊組成
系統模塊 |
模塊功能 |
ConstData |
存放預設城市 |
Weather |
設置當天和未來幾天天氣類 |
chacun |
解析並獲得天氣信息 |
MainActivity |
天氣查詢主界面 |
3 系統實現
3.1 UI界面實現
3.1.1主界面實現
Android用戶布局都是在布局在XML文件中,這些XML文件放在工程/res/layout下。在安卓系統中,開發人員把用戶界面放在在XML文檔中定義,可以使XML文檔專門負責用戶UI界面設計,而java程序負責功能實現,從而降低程序耦合,便於程序的維護與擴展。
多數的界面控件都在android.view和android.widget包中,android.view.View為他們的父類。
在activity.main主界面XML文件中,定義了TextView、Button、ExitText、這三種基本控件,它們分別表示文字顯示、按鈕切換、文本輸入TextView用來顯示軟件性質,Button用來控制“查詢”鍵,ExitText用來輸入所查詢城市名字。
主界面XML文件還定義了ListView、Spinner這兩個需要適配器的布局文件和LinearLayout、RelativeLayout布局文件。ListView、Spinner分別用來顯示天氣查詢結果列表、下拉欄里的城市,LinearLayout、RelativeLayout分別表示線性布局和相對布局,控制整個主界面的布局。
3.1.2天氣內容界面實現
在list_item.XML文件中通過LinearLayout布局文件的設置將天氣結果以下表的格式顯示出來
date |
week |
weather |
tempt |
wind |
|
dressing_advice |
3.2 設置天氣類Weather
設置一個天氣類Weather,以便查詢和顯示天氣。
3.2.1定義私有變量
使用private定義私用成員city、date、week、weather、temperature、wind、dressing_advice,使用戶不能私自提取天氣數據,只能按照自己構造的方法提取出來。
3.2.2構造函數
通過重載構造函數Weather創建有參和無參兩種對象方式,增強系統使用彈性。既能運用反射機制生成對象,用能為繼承使調用Weather類構造函數方便。
3.2.3提供取值方法
運用反射機制getClass和setClass的方法,提供獲得天氣具體數據的方法。
3.3天氣查詢功能實現
3.3.1解析天氣信息
天氣預報系統最重要的就是獲取天氣信息,為獲得實時天氣信息,我們就要訪問專門天氣信息的網站把返回的信息解析出來。系統采HttpURLConnection的訪問方式來和Web 客戶機取得聯系,並以字節數組的方式返回。其中urlPath由三部分組成:
信息源網址 |
cityname |
key |
其中信息源網址由haoservice服務平台提供提供,cityname為所查詢城市的名字,key表示用戶標識。
我通過http://apis.haoservice.com/weather這個網站提供的參數來獲取指定城市的天氣信息。它主要使用JSON(JavaScript Object Notation)數據交換格式,可以在在異步應用程序中將字符串從 Web 客戶機傳遞給服務器端,有對象object和數組array這兩種數據結構。對象是一個無序的“‘名稱/值’對”集合,數組是值(value)的有序集合。
3.3.2獲得天氣信息
將解析后的JSON格式天氣數據分別賦值給定義的todayWeather類和we類,它們是實例化的天氣類Weather,分別表示當天天氣信息和未來天氣信息,最后添加到數組列表weathers中。這樣就能獲得天氣信息。
3.4主程序實現
3.4.1設置Activity界面
通過setContentView(R.layout.activity_main)將主程序MainActivity采用activity_main布局。利用findViewById函數將主程序按鈕與布局文件一一對應,其中下拉欄Spinner與顯示列表Listview綁定對應的適配器。對應列表如下:
主程序MainActivity |
activity_main界面 |
currentCityTv |
currentCity |
city_Et |
cityEt |
city_spr |
citySpinner |
mListView |
mListView |
3.4.2顯示天氣
為天氣結果顯示列表ListView綁定一個適配器myAdapter,通過myAdapter.notifyDataSetChanged通知MainActivity更新顯示ListView。配器myAdapter類圖如下:
適配器myAdapter繼承 BaseAdapter類,ListView在開始繪制的時候,系統首先調用getCount()函數,根據他的返回值得到 listView的長度,然后根據這個長度,調用getView()逐一繪制每一行。getItem返回該對象本身,getItemid返回該對象的索引。getView()有三個參數,position表示將顯示的是第幾行,covertView是從布局文件中inflate來的布局,即list_item.XML文件中的布局。
在getView函數中使用ViewHolder的作用是用來優化顯示效率,即之前顯示過的不用再從布局文件讀取,直接從緩存中讀取。它只是一個靜態類,它的作用就在於減少不必要的調用findViewById,把對底下的控件引用存在ViewHolder里面,再用convertView.setTag(holder)把它放在view里,下次就可以用(ViewHolder) convertView.getTag()直接取了。
3.4.3利用Handler來實現天氣信息更新
Handler與調用者處於同一線程,如果Handler里面做耗時的動作,調用者線程會阻塞,這種操作線程是不安全的。因此本程序采取調用線程Thread(Runnable),在線程中處理操作。Thread線程發出Handler消息,通知更新,Handler根據接收的消息,處理更新。
Thread線程在查詢完天氣后發出msg信息,Handler根據接收的消息顯示查詢結果。
4系統測試
4.1測試目的
1.確定軟件質量,確保軟件正確運行。
2.確定信息正確性,確保天氣情況與實際相符。
4.2測試內容
1.在文本欄中輸入城市
2.在下拉欄中選擇城市
3.在輸入欄中輸入不存在的城市
4.不輸入城市查詢
5總結
本次實驗主要完成了一款基於android平台的天氣預報軟件的設計與實現。提出了android用戶界面設計、獲取並解析城市列表數據的辦法,給出了在用戶界面上的原理與實現過程,最后通過模擬器進行了應用程序的調試。
本程序能實現當日及未來一個星期的天氣預報,有良好的穩定性及擴展性,但是有待完善的地方依然很多,未來改進時可以考慮一下幾點:加入國際城市;根據不同天氣狀態動態變化背景圖片;可以添加常用城市;將軟件做成桌面小窗口方便查詢。這些功能都需要在日后學習中不斷探索研究,以建立實用的天氣預報系統。
感謝婁老師和同學們給予我的幫助!