天天看點

[Android] AlertDialog擷取網上天氣并顯示各城市天氣

    言歸正傳,我主要通過兩種方法實作:

    1.第一種方法是通過調用中國天氣網資訊實作的,它的思想是通過查詢靜态資料庫中個城市對應的WeatherCode,在通過通路中國天氣網擷取JSON格式資料顯示,天氣對應的圖檔也從網上擷取.

    2.第二種方法是通過新浪天氣API接口實作的,它隻需要輸入查詢的具體城市或縣城即可擷取JSON格式天氣,而且天氣對應圖檔采用res中靜态的對應.

    參考資料:

    中國天氣網網上資料較多,主要參考郭神《Android第一行代碼》

中國天氣網提供了擷取天氣及各個城市的代号資訊.通過下面兩種接口方法擷取北京天氣,而擷取詳細資訊的接口可能已更改.

    程式主要通過該URL擷取城市的天氣,其中101010100表示的就是北京的天氣代号,它是如何擷取的呢?同樣中國天氣網提供了網址擷取不同城市/縣城的天氣代号.

    伺服器會傳回省份名稱+省級代号(一級清單,包括省/直轄市/自治區).如下:

   在輸入省級代号擷取二級碼,如北京city01,貴州city26

此時你如果你對地理熟悉,你可以發現它們分别是每個省的地區,同樣道理可以擷取每個地區的縣份或區的編碼.如輸入city2605

通過這種方法就可以把全國所有省、市、縣地區的天氣都實時擷取.如下是凱裡市對應的天氣代号

到了此處,想必你也知道如果擷取凱裡市的天氣了吧.就是輸入網址

[Android] AlertDialog擷取網上天氣并顯示各城市天氣

   由于在使用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.運作效果如下圖所示

[Android] AlertDialog擷取網上天氣并顯示各城市天氣
[Android] AlertDialog擷取網上天氣并顯示各城市天氣
[Android] AlertDialog擷取網上天氣并顯示各城市天氣

   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表和資料.如下圖所示:

[Android] AlertDialog擷取網上天氣并顯示各城市天氣

   (4)學會自定義AlertDialog并調用它,同時擷取網絡圖檔那個URL當時檢視到沒記錄,可惜了.

    PS:最後推薦看看郭神《Android第一行代碼》第十四章關于天氣的講解,但基本原理和方法該文章我都已經講述了.

新浪天氣API方法同上,但唯一不同點是輸入城市名稱.這樣就不需要再次擷取WeatherCode,通路網址如下:

    如擷取北京的新浪天氣,傳回的JSON格式如下:

程式中顯示效果如下圖所示,顯示的時候是參考了huanghsh的模闆,但是不知道它源位址.是以見諒!否則推薦大家去下載下傳看看~

[Android] AlertDialog擷取網上天氣并顯示各城市天氣
[Android] AlertDialog擷取網上天氣并顯示各城市天氣

   其中原理與上面相同,通過調用HttpService.getWeather(cityName)函數擷取天氣.其中自定義類HttpService代碼中getWeather如下,而DefaultHttpClient是自定義設定代理.

   而天氣圖檔是通過res/drawable檔案夾下靜态圖檔顯示,該方法也介紹下!

   其中自定義對話框輸入AlertDialog,載入weather_other_city.xml布局僅有一個輸入框ExitText控件.通過Intent傳參至顯示天氣的界面.具體代碼如下.

   由于新浪方法類似,是以就簡述了些其他如顯示靜态圖檔和AlertDialog的知識.

   最後簡單總結下吧!第一種方法主要通過中國天氣網顯示資訊,其核心是擷取天氣代碼WeatherCode,然後通路URL擷取JSON格式資料并顯示.第二種方法僅僅是傳入城市名稱(不要傳錯),然後擷取JSON資料顯示天氣即可.最後希望文章對大家有所幫助,如果有錯誤或不足之處,還請海涵~