標籤:
天氣用戶端開發報告
1系統需求分析
1.1功能性需求分析
天氣預報用戶端,最基本就是為使用者提供準確的天氣預報資訊。天氣查詢結果有兩種:一種是當天天氣資訊,資訊結果比較詳細,除溫度、天氣狀況外還可以提示穿衣建議、濕度、風向等資訊,這樣使天氣資訊更加完善;一種是未來幾天天氣預報資訊,提供未來幾天的天氣狀況,方便使用者的出行預判。
1.2非功能需求分析
為了保證用戶端能夠長期、安全、穩定、可靠、高效的運行,天氣用戶端應該滿足以下的需求:
1)系統處理的準確性和及時性
2)系統的開放性和系統的可擴充性
3)系統的易用性和易維護性
4)系統的資源低消耗性
1.3 UML使用案例圖
用例名稱:菜單介面 |
參與者:使用者 |
簡要說明:使用者選擇城市後,點擊查詢,即可在首頁顯示天氣資訊 |
前置條件:使用者已經進入天氣查詢軟體 |
基本事件流:1.使用者在輸入欄輸入城市名稱,點擊查詢,擷取該城市天氣資訊 2.使用者在下拉欄選擇城市名稱,點擊查詢,擷取該城市天氣資訊 3.用例終止 |
其他事件流:在點擊查詢前,輸入或選擇任意城市名都不會顯示結果 |
例外狀況事件流:天氣資訊擷取失敗時,介面提示錯誤資訊 |
後置條件:顯示城市一星期以內天氣資訊 |
2系統架構設計
2.1介面架構
結合使用者查詢習慣,在主介面我們可以提供兩種查詢方法:
1.輸入查詢:
在城市輸入欄中輸入所需查詢城市的名字,點擊查詢按鈕即可顯示出天氣資訊。
2.選取查詢:
針對常見大中型城市,如北京、上海等,為方便使用者查詢,只要在預設城市的下拉欄中尋找使用者所尋找城市,點擊查詢按鈕即可顯示出天氣資訊。
用Axure RP 畫出的介面設計圖如下:
2.2功能模組
從模組結構圖可以看出,後台服務是整個程式的核心,主要是資料擷取模組,負責從haoserver天氣預報服務介面獲得天氣資訊。後台服務可以通過查詢服務來啟動。
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 系統模組設計
整個系統由四個模組組成
系統模組 |
模組功能 |
ConstData |
存放預設城市 |
Weather |
設定當天和未來幾天天氣類 |
chacun |
解析並獲得天氣資訊 |
MainActivity |
天氣查詢主介面 |
3.2.1 設定天氣類Weather
設定一個天氣類Weather,以便查詢和顯示天氣。
(1)定義私人變數
使用private定義私用成員city、date、week、weather、temperature、wind、dressing_advice,使使用者不能私自提取天氣資料,只能按照自己構造的方法提取出來。
(2)建構函式
通過重載建構函式Weather建立有參和無參兩種對象方式,增強系統使用彈性。既能運用反射機制產生對象,用能為繼承使調用Weather類建構函式方便。
(3)提供取值方法
運用反射機制getClass和setClass的方法,提供獲得天氣具體資料的方法。
3.2.2天氣查詢功能設計
(1)解析天氣資訊
天氣預報系統最重要的就是擷取天氣資訊,為獲得即時天氣資訊,我們就要訪問專門天氣資訊的網站把返回的資訊解析出來。
系統採取HttpURLConnection的訪問方式來和Web 客戶機取得聯絡,並以位元組數組的方式返回。其中urlPath由三部分組成:
其中資訊源網址由haoservice服務平台提供提供,cityname為所查詢城市的名字,key表示使用者標識。
我通過http://apis.haoservice.com/weather這個網站提供的參數來擷取指定城市的天氣資訊。它主要使用JSON(JavaScript Object Notation)資料交換格式,可以在在非同步應用程式中將字串從 Web 客戶機傳遞給伺服器端,有對象object和數組array這兩種資料結構。對象是一個無序的“‘名稱/值’對”集合,數組是值(value)的有序集合。
(2)獲得天氣資訊
將解析後的JSON格式天氣資料分別賦值給定義的todayWeather類和we類,它們是執行個體化的天氣類Weather,分別表示當天天氣資訊和未來天氣資訊,最後添加到數組列表weathers中。這樣就能獲得天氣資訊。
3.2.3主程式設計
(1)設定Activity介面
使用Activity中的onCreate方法來初始化Activity執行個體對象,構建參數saveInsanceState儲存執行個體狀態。
通過setContentView(R.layout.activity_main)將主程式MainActivity採用activity_main布局。利用findViewById函數將主程式按鈕與布局檔案一一對應,對應列表如下:
主程式MainActivity |
activity_main介面 |
currentCityTv |
currentCity |
city_Et |
cityEt |
city_spr |
citySpinner |
mListView |
mListView |
其中下拉欄Spinner與顯示列表Listview綁定對應的適配器。適配器將布局檔案和資料連線。
(2)顯示天氣
為天氣結果顯示列表ListView綁定一個適配器myAdapter,通過myAdapter.notifyDataSetChanged通知MainActivity更新顯示ListView。配器myAdapter類圖如下:
適配器myAdapter是執行個體化的MyAdapter,繼承 BaseAdapter類。ListView在開始繪製的時候,系統首先調用getCount()函數,根據他的傳回值得到 listView的長度,然後根據這個長度,調用getView()逐一繪製每一行。getItem返回該對象本身,getItemid返回該對象的索引。getView()有三個參數:int position, View convertView, ViewGroup parent。position表示將顯示的是第幾行,covertView是從布局檔案中inflate來的布局,即list_item.XML檔案中的布局。
在getView函數中使用ViewHolder的作用是用來最佳化顯示效率,即之前顯示過的不用再從布局檔案讀取,直接從緩衝中讀取。它只是一個靜態類,它的作用就在於減少不必要的調用findViewById,把對底下的控制項引用存在ViewHolder裡面,再用convertView.setTag(holder)把它放在view裡,下次就可以用(ViewHolder) convertView.getTag()直接取了。
(3)利用Handler來實現天氣資訊更新
Handler與調用者處於同一線程,如果Handler裡面做耗時的動作,調用者線程會阻塞,這種操作線程是不安全的。因此本程式採取調用線程Thread(Runnable),線上程中處理操作。Thread線程發出Handler訊息,通知更新,Handler根據接收的訊息,處理更新。
Thread線程在查詢完天氣後發出msg資訊,Handler根據接收的訊息顯示查詢結果。
4系統測試
4.1測試目的
1.確定軟體品質,確保軟體正確運行。
2.確定資訊正確性,確保天氣情況與實際相符。
4.2測試內容
編號 |
許可權 |
測試頁 |
描述/輸入/操作 |
期望結果 |
真實結果 |
備忘 |
01 |
無 |
列表頁面 |
在文本欄中輸入城市 |
顯示輸入城市 |
顯示輸入城市 |
測試圖1 |
02 |
在下拉欄中選擇城市 |
顯示選擇城市 |
顯示選擇城市 |
測試圖2 |
03 |
在文本欄中輸入城市 點擊查詢 |
顯示輸入城市及對應天氣資訊 |
顯示輸入城市及對應天氣資訊 |
測試圖3 |
04 |
在下拉欄中選擇城市 點擊查詢 |
顯示選擇城市及對應天氣資訊 |
顯示選擇城市及對應天氣資訊 |
測試圖4 |
05 |
在輸入欄中輸入不存在的城市點擊查詢 |
顯示查詢錯誤及其原因 |
顯示查詢錯誤及其原因:該城市名稱錯誤或不支援該城市 |
測試圖5 |
06 |
不輸入城市查詢 |
顯示查詢錯誤及其原因 |
顯示查詢錯誤及其原因:查詢錯誤不可為空 |
測試圖6 |
1.在文本欄中輸入城市
2.在下拉欄中選擇城市
3.在文本欄中輸入城市,點擊查詢
4.在下拉欄中選擇城市,點擊查詢
5.在輸入欄中輸入不存在的城市
6.不輸入城市查詢
5總結
本次實驗主要完成了一款基於android平台的天氣預報軟體的設計與實現。提出了android使用者介面設計、擷取並解析城市列表資料的辦法,給出了在使用者介面上的原理與實現過程,最後通過模擬器進行了應用程式的調試。
從一開始什麼都不懂到最後摸索完成這個軟體收穫很多,主要熟悉了Android環境搭建、介面控局布置、擷取資料和整體設計方案。最終實現選擇城市和顯示天氣預報結果功能。在開發中遇到很多問題:資料來源不提供介面服務、代碼不夠健壯、JSON資料顯示不全、Key到期,最終問題都得到解決。
本程式能實現當日及未來一個星期的天氣預報,有良好的穩定性及擴充性,但是有待完善的地方依然很多,未來改進時可以考慮一下幾點:加入國際城市;根據不同天氣狀態動態變化背景圖片;可以添加常用城市;將軟體做成案頭小視窗方便查詢。這些功能都需要在日後學習中不斷探索研究,以建立實用的天氣預報系統。
感謝婁老師和同學們給予我的協助!
Android實踐項目彙報(總結)-修改