言歸正傳,我主要通過兩種方法實作:
1.第一種方法是通過調用中國天氣網資訊實作的,它的思想是通過查詢靜态資料庫中個城市對應的WeatherCode,在通過通路中國天氣網擷取JSON格式資料顯示,天氣對應的圖檔也從網上擷取.
2.第二種方法是通過新浪天氣API接口實作的,它隻需要輸入查詢的具體城市或縣城即可擷取JSON格式天氣,而且天氣對應圖檔采用res中靜态的對應.
參考資料:
中國天氣網網上資料較多,主要參考郭神《Android第一行代碼》
中國天氣網提供了擷取天氣及各個城市的代号資訊.通過下面兩種接口方法擷取北京天氣,而擷取詳細資訊的接口可能已更改.
程式主要通過該URL擷取城市的天氣,其中101010100表示的就是北京的天氣代号,它是如何擷取的呢?同樣中國天氣網提供了網址擷取不同城市/縣城的天氣代号.
伺服器會傳回省份名稱+省級代号(一級清單,包括省/直轄市/自治區).如下:
在輸入省級代号擷取二級碼,如北京city01,貴州city26
此時你如果你對地理熟悉,你可以發現它們分别是每個省的地區,同樣道理可以擷取每個地區的縣份或區的編碼.如輸入city2605
通過這種方法就可以把全國所有省、市、縣地區的天氣都實時擷取.如下是凱裡市對應的天氣代号
到了此處,想必你也知道如果擷取凱裡市的天氣了吧.就是輸入網址
由于在使用google浏覽器擷取城市代号時總是報錯"This page contains the following errors",你隻需要使用IE檢視源碼就可擷取成功.但是我沒有通過網上動态擷取城市代号,方法知道即可.
其中天氣圖示可通過網站檢視,而擷取具體圖示網址忘記記錄了.
這裡就看着郭神的書實作吧,那個界面挺好看的.同時我自定義的AlertDialog對話框也挺好看的.
1.布局檔案 activity_main.xml
2.在res/drawable-hdpi檔案夾中添加兩張按鈕圖檔home.png和refresh.png
3.MainActivity.java
4.最後在AndroidManifest.xml中聲明網絡權限
5.運作效果如下圖所示
6.需要注意幾點
(1)在通路http或擷取上傳網絡資料時,你可能會遇到錯誤導緻程式崩潰,即錯誤NetworkOnMainThreadException.你需要自定義線程實作,通過:
(2)當從網上擷取JSON格式資料後,你需要學會JSONObject将資料解析出來.同時如果可能與資料庫進行操作,存入db資料庫中.
(3)如果可能通過自定義DBHelper(繼承自SQLiteOpenHelper)和DBManager擷取靜态資料庫中資料,檢視對應城市或縣份的天氣代碼.但是重新移植資料庫總是報錯"no such table:city_table".但是明明存在,可能是資料庫路徑"/data/data/包名/databases/mydata.db"定義或引用錯誤,仍未解決.
通過SQLiteSpy軟體打開db檔案,很明顯存在city_table表和資料.如下圖所示:
(4)學會自定義AlertDialog并調用它,同時擷取網絡圖檔那個URL當時檢視到沒記錄,可惜了.
PS:最後推薦看看郭神《Android第一行代碼》第十四章關于天氣的講解,但基本原理和方法該文章我都已經講述了.
新浪天氣API方法同上,但唯一不同點是輸入城市名稱.這樣就不需要再次擷取WeatherCode,通路網址如下:
如擷取北京的新浪天氣,傳回的JSON格式如下:
程式中顯示效果如下圖所示,顯示的時候是參考了huanghsh的模闆,但是不知道它源位址.是以見諒!否則推薦大家去下載下傳看看~
其中原理與上面相同,通過調用HttpService.getWeather(cityName)函數擷取天氣.其中自定義類HttpService代碼中getWeather如下,而DefaultHttpClient是自定義設定代理.
而天氣圖檔是通過res/drawable檔案夾下靜态圖檔顯示,該方法也介紹下!
其中自定義對話框輸入AlertDialog,載入weather_other_city.xml布局僅有一個輸入框ExitText控件.通過Intent傳參至顯示天氣的界面.具體代碼如下.
由于新浪方法類似,是以就簡述了些其他如顯示靜态圖檔和AlertDialog的知識.
最後簡單總結下吧!第一種方法主要通過中國天氣網顯示資訊,其核心是擷取天氣代碼WeatherCode,然後通路URL擷取JSON格式資料并顯示.第二種方法僅僅是傳入城市名稱(不要傳錯),然後擷取JSON資料顯示天氣即可.最後希望文章對大家有所幫助,如果有錯誤或不足之處,還請海涵~