close

3.jpg

中央氣象局有提供 open data 讓民眾使用,首先我們要註冊中央氣象局的帳號,如下網址:

https://opendata.cwb.gov.tw/index

1.jpg

 

註冊完就可以取得授權碼,那組序號就是中央氣象局用來認證的ID,接著來到下述網頁:

https://opendata.cwb.gov.tw/dist/opendata-swagger.html

 

挑選一個你需要的資料來源:

2.jpg

 

這邊我選擇一般天氣預報-今明36小時天氣預報,輸入授權碼後點”Execute”:

3.jpg

 

然後就會給你 Request URL output JSON:

4.jpg

中央氣象局回傳欄位的說明可以參考下述連結:

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”/>

 

如圖所示:

5.jpg

 

接著新增一個java file,如下:

6.jpg

 

我新增了 otherThread,然後在裡面創建一個新的class並且 extend Thread:

7.jpg

 

然後我們在MainActivity中呼叫這個 Thread:

8.jpg

 

這樣就可以呼叫到 otherThread 這個執行緒了。

接著介紹怎樣去爬回中央氣象局API的資料:

        try{
           
// HttpURLConnection
           
String url = "https://opendata.cwb.gov.tw/api/v1/rest/xxxxx";
            InputStream is =
new URL(url).openStream();
            BufferedReader rd =
new BufferedReader(new InputStreamReader(is,"utf-8")); //避免中文亂碼問題
           
StringBuilder sb = new StringBuilder();
           
int cp;
           
while ((cp = rd.read()) != -1) {
                sb.append((
char) cp);
            }
            System.
out.println(sb.toString());
        }catch(Exception e){
            e.printStackTrace();
        }

 

 

上述寫法直接用串流方式取得URL的資訊並且呈現。我們把這段程式碼寫在 otherThread中,如下圖:

9.jpg

 

這時候執行 MainActivity 就不會出現android.os.NetworkOnMainThreadException的錯誤了,並且可以在 Android Studio 下方的 logcat 看到中央氣象局回傳的結果。

 

接下來,我們希望要把中央氣象局的資訊抓下來後,更新MainActivity中的TextView,這時候就要使用到 HandlerMessage的作法,邏輯是在MainActivity中建構static Handler,然後在其他Thread建構 Message,其他Thread完成工作後,將資訊帶入Bundle 再擺入到Message,並且呼叫MainActivityHandler 來傳送,然後在MainActivity中取用該資訊。下圖是完整的MainActivity:

10.jpg

另一個呼叫中央氣象局的Thread,主要是25-29:

11.jpg

 

然後就可以開始執行 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

HandlerMessage: http://hsingjungchen.blogspot.com/2017/07/androidhandlerthreadui.html

 

arrow
arrow
    全站熱搜

    葛瑞斯肯 發表在 痞客邦 留言(3) 人氣()