中央氣象局有提供 open data 讓民眾使用,首先我們要註冊中央氣象局的帳號,如下網址:
https://opendata.cwb.gov.tw/index
註冊完就可以取得授權碼,那組序號就是中央氣象局用來認證的ID,接著來到下述網頁:
https://opendata.cwb.gov.tw/dist/opendata-swagger.html
挑選一個你需要的資料來源:
這邊我選擇”一般天氣預報-今明36小時天氣預報”,輸入授權碼後點”Execute”:
然後就會給你 Request URL 與 output JSON:
中央氣象局回傳欄位的說明可以參考下述連結:
https://opendata.cwb.gov.tw/opendatadoc/MFC/D0047.pdf
https://opendata.cwb.gov.tw/opendatadoc/CWB_Opendata_API_V1.2.pdf
這邊要特別提醒,在 Android 中不能在 MainActivity 裡面進行呼叫URL (爬網) 的動作,如果在 MainActivity 中進行的話會出現下述錯誤:
android.os.NetworkOnMainThreadException |
所以我們要另外開一個 Thread 來進行爬網的動作,然後將結果回傳到 MainActivity 進行呈現,下述會依序介紹這些步驟,首先我們要先開Android的網路權限,修改方式如下:
主要是在AndroidManifest.xml中加入下述資訊:
<uses-permission android:name=“android.permission.INTERNET”/> |
如圖所示:
接著新增一個java file,如下:
我新增了 otherThread,然後在裡面創建一個新的class並且 extend Thread:
然後我們在MainActivity中呼叫這個 Thread:
這樣就可以呼叫到 otherThread 這個執行緒了。
接著介紹怎樣去爬回中央氣象局API的資料:
try{
|
上述寫法直接用串流方式取得URL的資訊並且呈現。我們把這段程式碼寫在 otherThread中,如下圖:
這時候執行 MainActivity 就不會出現android.os.NetworkOnMainThreadException的錯誤了,並且可以在 Android Studio 下方的 logcat 看到中央氣象局回傳的結果。
接下來,我們希望要把中央氣象局的資訊抓下來後,更新MainActivity中的TextView,這時候就要使用到 Handler與Message的作法,邏輯是在MainActivity中建構static Handler,然後在其他Thread建構 Message,其他Thread完成工作後,將資訊帶入Bundle 再擺入到Message,並且呼叫MainActivity的Handler 來傳送,然後在MainActivity中取用該資訊。下圖是完整的MainActivity:
另一個呼叫中央氣象局的Thread,主要是25-29行:
然後就可以開始執行 MainActivity,就可以發現大功告成了。
Reference:
多執行緒: https://larry850806.github.io/2016/06/10/Java-Thread/
取得URL資訊: https://stackoverflow.com/questions/4308554/simplest-way-to-read-json-from-a-url-in-java
Handler與Message: http://hsingjungchen.blogspot.com/2017/07/androidhandlerthreadui.html
留言列表